{
    "openapi": "3.1.0",
    "jsonSchemaDialect": "https://spec.openapis.org/oas/3.1/dialect/base",
    "info": {
        "title": "AnagenSys API",
        "version": "1.0.0",
        "description": "API do AnagenSys (clínica, portal do paciente e integrações).\n\nAutenticação: equipa (Bearer de /auth/entrar), paciente (Bearer de /portal/auth/entrar) e integrações (OAuth 2.0 client credentials em /oauth/token).\n\nEnvelope: sucesso {\"ok\":true,\"dados\":…,\"meta\":{…}}; erro {\"ok\":false,\"erro\":{\"codigo\",\"mensagem\",\"campos\"}} com o código HTTP certo e um código estável do catálogo (components.schemas.Erro).\n\nConvenções: X-Request-Id em todas as respostas (aceite no pedido); limites com X-RateLimit-Limit/-Remaining/-Reset e Retry-After no 429; Idempotency-Key em POST (24 h); paginação pagina/por_pagina (máx. 100) com meta.total; filtros f[campo]=valor, f[campo][de]=, f[campo][ate]=, f[campo][em]=a,b; ordenação ordem=campo:asc,campo2:desc; datas ISO 8601 com fuso; dinheiro com 2 casas e moeda; unidades explícitas (x-unidade); versão no caminho (/v1), alterações incompatíveis só numa /v2, descontinuação anunciada com os cabeçalhos Deprecation e Sunset.\n\nProteção de dados: cada pedido respeita a matriz de permissões e o âmbito; campos sem permissão não são devolvidos; leituras de dados clínicos ficam na auditoria imutável.",
        "contact": {
            "name": "AnagenSys",
            "url": "https://anagen.pt"
        }
    },
    "servers": [
        {
            "url": "https://anagen.pt/api/v1",
            "description": "Servidor da clínica"
        }
    ],
    "tags": [
        {
            "name": "Autenticação",
            "description": "Entrada da equipa (palavra-passe → segundo fator → termo de sigilo), renovação e saída."
        },
        {
            "name": "Portal — autenticação",
            "description": "Entrada e registo dos pacientes no portal."
        },
        {
            "name": "Integrações",
            "description": "Consumo das integrações, catálogo de eventos e teste de webhooks."
        },
        {
            "name": "Sessão",
            "description": "Quem sou, menu, clínicas, notificações, pesquisa e acesso de emergência."
        },
        {
            "name": "Ficheiros",
            "description": "Carregamento e ligações assinadas de curta duração."
        },
        {
            "name": "Perfil",
            "description": "Dados pessoais, palavra-passe, segundo fator e sessões."
        },
        {
            "name": "Permissões",
            "description": "Matriz perfil × módulo × âmbito (próprios, equipa, departamento, todos) × fase, permissões por cargo, campos ocultos ou só de leitura por perfil, exceções por pessoa e permissões efetivas por pessoa."
        },
        {
            "name": "Auditoria",
            "description": "Registo imutável de acessos e ações, com verificação da cadeia."
        },
        {
            "name": "Definições",
            "description": "Definições da clínica e da plataforma; email de teste."
        },
        {
            "name": "Modelos de IA",
            "description": "Serviço local de IA primeiro e serviço externo como alternativa, por uso."
        },
        {
            "name": "Ajuda",
            "description": "Centro de Ajuda, ajuda contextual e Manual do Sistema."
        },
        {
            "name": "Agenda",
            "description": "Calendário por profissional ou sala, marcações com conflitos verificados no servidor, disponibilidade, ocupação, lembretes, ligação pública da marcação, lista de espera e sincronização pessoal com calendários externos (só leitura)."
        },
        {
            "name": "Fluxo do dia",
            "description": "Quadro do dia por posto (por chegar, admissão, preparação, extração, implantação, recobro, saída) com tempos por posto, e ecrã da sala de espera com o mínimo de dados."
        },
        {
            "name": "Teleconsulta",
            "description": "Sala de espera virtual, consentimento antes de iniciar, admissão, identidade, presentes, gravação só com consentimento próprio, capturas, relatório obrigatório (com proposta opcional do Assistente) e comprovativo de presença. Vídeo pelo serviço de vídeo escolhido nas Definições."
        },
        {
            "name": "Mapa de cirurgias",
            "description": "Ciclo pré-marcada → reservada → validada → confirmada (só com consentimento cirúrgico válido) → em curso → concluída, equipa com conflitos verificados, aptidão, indicadores, escala semanal, ocupação do bloco e checklist pré-operatória."
        },
        {
            "name": "Painel cirúrgico",
            "description": "Dia da cirurgia: fases com cronómetro e pausas, contagem de enxertos por tipo de UF (1, 2, 3, 4+), lotes com tempo fora do corpo, transecção por amostragem, enfermagem e anestesia com alerta de lidocaína em mg/kg, checklists por fase, alta e fecho definitivo."
        },
        {
            "name": "Avisos no telemóvel",
            "description": "Registo dos aparelhos com a app que recebem avisos do sistema, preferências por categoria e aviso de teste. Os avisos nunca levam conteúdo clínico nem pessoal: só o nome da clínica, uma frase genérica e a ligação ao ecrã (nos dados, invisível no ecrã bloqueado). O envio é feito pelo agendador a partir das notificações do núcleo."
        },
        {
            "name": "Ficha do paciente",
            "description": "Registo único do paciente: cabeçalho, alertas clínicos, episódios, jornada e secções de todos os módulos (só as que a pessoa pode ver), resumo pelo assistente de IA da clínica, duplicados, fusão assistida, alertas de medicação antes de prescrever e importação de fichas. Os dados clínicos só saem para quem tem ficha.clinica e o paciente no âmbito; a administração, o comercial e a receção nunca recebem conteúdo clínico (tetos de proteção de dados). Os recursos genéricos /r/pacientes, /r/episodios, /r/episodios_equipa e /r/pacientes_alertas são documentados na secção «Recursos»."
        },
        {
            "name": "Consultas",
            "description": "Consulta clínica: criação com a anamnese pré-preenchida da última consulta assinada, gravação do rascunho com elegibilidade ao vivo, assinatura com impressão digital SHA-256 (depois só aditamentos), validação da viabilidade, escriba e pré-análise pelo assistente de IA da clínica (sempre propostas), completude antes da cirurgia e decisão humana sobre as propostas. O recurso genérico /r/consultas lista e filtra as consultas."
        },
        {
            "name": "Validação médica",
            "description": "Fila única do que espera decisão de um profissional: propostas da IA pendentes, respostas de formulários por validar, pré-avaliações do site, alertas relatados e consultas por assinar — só de pacientes no âmbito clínico. Inclui a revisão do desempenho da IA (concordância)."
        },
        {
            "name": "Formulários",
            "description": "Construtor de formulários clínicos (passos, secções, 12 tipos de pergunta, regras condicionais, pontuação com faixas, alarmes e alertas), versões, biblioteca de modelos, tradução pelo assistente de IA da clínica, preenchimento pela equipa ou por integrações e pedidos de preenchimento por ligação. Os recursos genéricos /r/formularios e /r/formularios_respostas são documentados na secção «Recursos»."
        },
        {
            "name": "Formulários por ligação",
            "description": "Preenchimento público por ligação, sem sessão: o token da ligação identifica o pedido, o paciente e a clínica. Usado pela app no modo paciente e por quem integra o formulário noutro sítio. As respostas ficam sempre por validar; ao paciente só se confirma a receção."
        },
        {
            "name": "Propostas",
            "description": "Propostas a partir do plano aprovado (M3) ou manuais: opções, extras, linhas, desconto com aprovação acima do limite do perfil, prestações, moeda com câmbio fixado, selo (SHA-256), envio com ligação pessoal, aceitação com prova, recusa, revisão, reativação e anulação. Margens e custos internos só para quem vê os valores de toda a clínica."
        },
        {
            "name": "Caixa",
            "description": "Caixa do dia: abertura com saldo inicial, pagamentos presenciais, reforços e levantamentos, fecho com contagem por método e diferença."
        },
        {
            "name": "Pagamentos",
            "description": "Plano de pagamentos do paciente, pedidos MB WAY, referências Multibanco e ligações de pagamento (fornecedor e credenciais por clínica), recebimentos manuais, cancelamento, reembolso e documentos fiscais emitidos pelo programa de faturação certificado da clínica. Nunca há dados de cartão."
        },
        {
            "name": "Comissões e honorários",
            "description": "Comissões da equipa comercial (nunca de médicos) e honorários médicos por ato próprio; quem não gere os valores vê só os seus."
        },
        {
            "name": "Stock",
            "description": "Consumos por cirurgia (saídas com lote, ligadas à cirurgia e ao paciente) e alertas de stock mínimo e validades."
        },
        {
            "name": "Portal — propostas e pagamentos",
            "description": "O paciente autenticado consulta as suas propostas enviadas, aceita ou recusa, vê os pagamentos e paga por MB WAY, Multibanco ou ligação."
        },
        {
            "name": "Proposta pública",
            "description": "Página da proposta por ligação pessoal (token de 64 caracteres; só o SHA-256 fica guardado). A clínica é a do registo da proposta. Sem sessão; formulários com CSRF, campo armadilha e limite por endereço."
        },
        {
            "name": "Avisos de fornecedores (comercial)",
            "description": "Avisos de pagamento do fornecedor, dos terminais de pagamento (SumUp e Stripe) e estado de documentos do programa de faturação. A clínica é resolvida pelo registo (referência, pedido ou documento) e validada com a chave dessa clínica; os pagamentos só ficam pagos depois de confirmados pela API do fornecedor."
        },
        {
            "name": "Carteira",
            "description": "Carteira do paciente: créditos, adiantamentos e pré-pagamentos, uso do saldo em pagamentos (sem nova fatura), devoluções com motivo e estornos. Movimentos imutáveis em cêntimos; a API devolve euros e o par *_centimos."
        },
        {
            "name": "Terminais de pagamento",
            "description": "Cobranças em terminais na nuvem (SumUp Solo, Stripe Terminal): envio ao terminal, estado ao vivo, cancelamento e reconciliação com a caixa. O cartão é lido no terminal; nada sai fora de produção."
        },
        {
            "name": "Vales de oferta",
            "description": "Venda de vales com código único, validade e saldo, consulta por código e uso total ou parcial em pagamentos. Finalidade múltipla (fatura no uso) ou única (fatura na venda)."
        },
        {
            "name": "Contas pagadoras e convenções",
            "description": "Extrato de contas pagadoras (subcontas com saldos) e atos repartidos entre um pagador ou convenção e o paciente; a parte do pagador é faturada à conta."
        },
        {
            "name": "Consentimentos",
            "description": "Recolha de consentimentos por finalidade (sem respostas pré-escolhidas), aviso de privacidade, entrega da informação e período de reflexão, assinaturas do paciente e do médico, envio para assinar em casa e prova de cada consentimento. Os registos são imutáveis."
        },
        {
            "name": "Documentos",
            "description": "Emissão a partir de modelos aprovados com campos automáticos, pré-visualização, envio para assinatura com código de uso único, assinatura no ecrã ou qualificada, partilha no portal, anulação e verificação pública pelo código XXXX-XXXX."
        },
        {
            "name": "Proteção de dados",
            "description": "Painel do encarregado (prazos de titulares, reclamações e incidentes, acessos anómalos, subcontratantes, registo de tratamentos, formação, registo ERS, conservação), revisão trimestral de acessos, «quem acedeu» por paciente, exportação de reclamações para a ERS e exportação dos dados de um titular."
        },
        {
            "name": "Funil e leads",
            "description": "Captação: criação de leads por formulários e anúncios, funil por fases com tempos-alvo, decisão, próxima ação, distribuição, duplicados, fusão e conversão em paciente."
        },
        {
            "name": "Caixa de entrada",
            "description": "Atendimento multicanal (portal, WhatsApp, Instagram, Messenger, email, SMS, chat do site) numa só caixa ligada à ficha, com filas, departamentos, notas internas, tradução e sugestões da IA."
        },
        {
            "name": "Marcador e chamadas",
            "description": "Listas de chamadas com guião, bloqueio de chamadas comerciais sem consentimento, clique para ligar e estatísticas."
        },
        {
            "name": "Agente de IA",
            "description": "Pedidos atendidos pelo agente de voz e pelos assistentes escritos, passagem à equipa, sinais de alarme, correções e revisão por amostra."
        },
        {
            "name": "Campanhas de marketing",
            "description": "Editor de campanhas por blocos, contagem de quem pode receber, aprovação clínica obrigatória, agendamento, teste e estatísticas."
        },
        {
            "name": "Resultados de marketing",
            "description": "Custos de anúncios, custo por lead, consulta e cirurgia, e conversões para as plataformas."
        },
        {
            "name": "Avisos de fornecedores (CRM)",
            "description": "Endereços que os fornecedores chamam (WhatsApp/Meta, central telefónica, agente de voz). Cada clínica é identificada pelo seu número, conta ou segredo; nunca por omissão."
        },
        {
            "name": "Chat do site e subscrições",
            "description": "Endpoints públicos: chat do site, anulação e confirmação de subscrições e registo de cliques."
        },
        {
            "name": "Painel",
            "description": "Painel por perfil: cartões dos módulos visíveis à pessoa, por ordem do perfil e das preferências, no formato único de blocos."
        },
        {
            "name": "Tarefas",
            "description": "Tarefas da equipa: as minhas, da equipa, quadro por estado, checklists, concluir e reabrir. Também para integrações (âmbito equipa.tarefas)."
        },
        {
            "name": "Chat interno",
            "description": "Canais privados, de grupo, por departamento, por paciente e por cirurgia; menções, anexos, confirmações de leitura e tarefas a partir de mensagens. Só equipa."
        },
        {
            "name": "Comunicados",
            "description": "Avisos internos com confirmação de leitura e lista de quem falta ler."
        },
        {
            "name": "Indicadores",
            "description": "Quatro grupos (financeiros, vendas, operacionais, atendimento) com comparação com o período anterior, gráficos e exportação CSV."
        },
        {
            "name": "Exportação",
            "description": "Exportação total dos dados da clínica e tokens de leitura para ferramentas de análise."
        },
        {
            "name": "Reuniões",
            "description": "Reuniões internas gravadas com aviso e consentimento de todos os presentes: transcrição pelo Assistente da clínica (serviço local primeiro), resumo e ações validados por uma pessoa. Só equipa."
        },
        {
            "name": "Academia",
            "description": "Formação interna da equipa: percursos por perfil, cursos, lições, testes e certificados. Só equipa."
        },
        {
            "name": "Visualizador 3D",
            "description": "Mostre o modelo 3D de um paciente dentro do seu site, por pouco tempo, sem dados pessoais.\n\n1. Nas credenciais da integração, peça o âmbito «ficha.captura:editar» (módulo clínico: exige a justificação aprovada pela direção clínica da clínica) e registe as ORIGENS do seu site (https://…).\n2. `POST /modelos3d/{id}/incorporacao` devolve `url` e `codigo_incorporacao` (iframe).\n3. Cole o iframe numa página de uma das origens autorizadas: a resposta envia `Content-Security-Policy: frame-ancestors` só com essas origens, por isso noutros sites o navegador recusa a moldura.\n\nA ligação dura entre 5 e 240 minutos (omissão da clínica), mostra uma cópia limpa da malha (por omissão sem o rosto), conta cada visualização e fica na auditoria do paciente. Revogue com `DELETE /modelos3d/incorporacoes/{id}`."
        },
        {
            "name": "Licenças",
            "description": "Licenças das clínicas: painel, lista, assistente de nova clínica e ações (superadministração)."
        },
        {
            "name": "A minha licença",
            "description": "Licença da clínica do pedido (administração da clínica) e estado leve para banners."
        },
        {
            "name": "Superadministradores",
            "description": "Contas com acesso às áreas da plataforma."
        },
        {
            "name": "Clínica pública",
            "description": "Escolha da clínica na app (modo paciente) por código; sem autenticação."
        },
        {
            "name": "Ambiente",
            "description": "Em que ambiente está o servidor. Fora de produção nada sai para o exterior (email, SMS, WhatsApp, webhooks, pagamentos, faturação, assistente externo, cópias para o destino externo) sem autorização no .env do servidor; a app e a web mostram a faixa «Ambiente de testes». Todas as respostas da API fora de produção trazem X-AX-Ambiente."
        },
        {
            "name": "Operação da plataforma",
            "description": "Cópias de segurança cifradas (diárias, semanais, mensais), verificação de integridade, destino externo imutável, testes de restauro num esquema à parte, vulnerabilidades, testes de intrusão e exercícios de continuidade, alojamento e subcontratantes. As ações longas ficam em fila (202) e o agendador trata delas nos minutos seguintes. Reservado aos superadministradores da plataforma (403 so_superadmin / segundo_fator_necessario para todos os outros, incluindo administradores de clínica)."
        },
        {
            "name": "Parceiros",
            "description": "Portal de parceiros: médicos e clínicas que encaminham pacientes. Conta própria com verificação de email e aprovação da clínica. O parceiro vê só os seus encaminhamentos e o estado; informação clínica (datas, procedimento e marcos) só com autorização expressa do paciente registada pela clínica. Recompensas de recomendação só para parceiros que não são médicos.\n\nAutenticação: `POST /parceiros/auth/entrar` devolve `token`; envie-o no cabeçalho `X-AX-Parceiro` (ou `Authorization: Bearer axp_…`). 5 falhas seguidas bloqueiam a conta 15 minutos."
        },
        {
            "name": "Planos cirúrgicos",
            "description": "Plano cirúrgico com o motor de cálculo no servidor: necessidade por zona, capacidade dadora, sessões, balanço, cenários, versões, aprovação com impressão digital, simulação e proposta."
        },
        {
            "name": "Motor de cálculo",
            "description": "Versões dos parâmetros do motor (quadro da secção 5 da análise), aprovadas só pela direção clínica de cada clínica."
        },
        {
            "name": "Galeria clínica",
            "description": "Capturas por marco, fotografias com qualidade, sobreposição da fotografia anterior, comparação, revisão das enviadas pelo paciente, partilha, desfocagem e modelos 3D."
        },
        {
            "name": "Tricoscopia",
            "description": "Campos de tricoscopia com densidades calculadas no servidor, médias por subzona e envio para o plano."
        },
        {
            "name": "Acompanhamento",
            "description": "Marcos do pós-operatório (d1 a m18), quadro, detalhe com circuito fechado, NPS, pedidos de fotografias e recuperação."
        },
        {
            "name": "Análise e plano",
            "description": "Desenhos sobre as fotografias, rosto e exportação para comunicação, contagem na imagem da tricoscopia, tricograma, massa capilar e mesmo ponto, perda futura, expectativas, proporções faciais, cirurgia real, áreas do dia 0, implantado por zona e afinação dos parâmetros."
        },
        {
            "name": "Portal — início",
            "description": "Resumo do portal do paciente e novidades."
        },
        {
            "name": "Portal — plano",
            "description": "Plano aprovado, simulação com aviso, modelo 3D e propostas."
        },
        {
            "name": "Portal — marcações",
            "description": "Marcar, remarcar, cancelar, confirmar e teleconsulta."
        },
        {
            "name": "Portal — documentos",
            "description": "Documentos partilhados, assinaturas, formulários e envios."
        },
        {
            "name": "Portal — autorizações",
            "description": "Consentimentos por finalidade, reflexão e revogação."
        },
        {
            "name": "Portal — fotografias",
            "description": "Envio guiado com verificação de luz e foco."
        },
        {
            "name": "Portal — mensagens",
            "description": "Mensagens seguras com a equipa."
        },
        {
            "name": "Portal — pagamentos",
            "description": "Saldo, faturas e pagamentos MB WAY/Multibanco/ligação."
        },
        {
            "name": "Portal — recuperação",
            "description": "Marcos pós-operatórios e instruções por fase."
        },
        {
            "name": "Portal — acessos",
            "description": "Quem acedeu aos dados do paciente."
        },
        {
            "name": "Portal — os meus dados",
            "description": "Contactos, alergias, preferências, direitos do titular e conta."
        },
        {
            "name": "Portal · Cuidados por fase",
            "description": "Vídeos e artigos de cuidados aprovados pela direção clínica, disponíveis conforme o dia depois da cirurgia."
        },
        {
            "name": "Escudo de entrada",
            "description": "Proteção de todas as entradas (equipa e portal): verificação do dispositivo por cálculos por tentativa (encontrar n tal que SHA-256(\"salt:n\") comece por «bits» bits a zero), espera por conta, armadilhas, bloqueio de origens e dispositivo de confiança. Os corpos de POST /auth/entrar, /portal/auth/codigo, /portal/auth/entrar e /portal/auth/registar aceitam escudo_desafio, escudo_solucao e dispositivo_confiavel; respostas 428 CHALLENGE_REQUIRED {motivo, desafio}, 429 ACCOUNT_COOLDOWN {espera} (+ Retry-After), 403 BLOCKED e 401 igual a credenciais erradas para tentativas automáticas. Os tokens trazem dispositivo_confiavel (guardar no armazenamento seguro e enviar nas entradas seguintes)."
        },
        {
            "name": "Atividade",
            "description": "Registo de atividade total da clínica: quem entrou, que página ou ecrã abriu, que registo ou paciente viu, o que criou, alterou, eliminou ou exportou. Nunca conteúdo clínico."
        },
        {
            "name": "Segurança da plataforma",
            "description": "Reservado à gestão da plataforma (403 para todos os outros, incluindo administradores de clínica). Tabelas globais de infraestrutura."
        },
        {
            "name": "Apresentação do AnagenSys",
            "description": "Página de produto pública e pedidos de demonstração (sem sessão)."
        },
        {
            "name": "Pré-avaliação online",
            "description": "Formulário, fotografias e envio da pré-avaliação (sem sessão)."
        },
        {
            "name": "Site — CMS",
            "description": "Páginas, blocos, imagens, publicação e versões do site da clínica."
        },
        {
            "name": "Site — analytics",
            "description": "Estatísticas anónimas e decisões de cookies."
        },
        {
            "name": "Site — incorporação",
            "description": "Pré-avaliação incorporada nos sites autorizados da clínica."
        },
        {
            "name": "Site — pré-avaliações",
            "description": "Revisão médica e resposta às pré-avaliações."
        },
        {
            "name": "Plataforma — Apresentação",
            "description": "Conteúdos da Apresentação do AnagenSys e pedidos de demonstração (gestão do produto)."
        },
        {
            "name": "Recursos",
            "description": "Recursos genéricos: a mesma definição gera a lista, o detalhe, a criação, a alteração, o apagamento (lógico), as ações e as opções, na web, na app e nesta API."
        },
        {
            "name": "Recurso: Certificados",
            "description": "Certificados — módulo «equipa.chat»."
        },
        {
            "name": "Recurso: Cursos da academia",
            "description": "Cursos da academia — módulo «equipa.chat»."
        },
        {
            "name": "Recurso: Lições",
            "description": "Lições — módulo «equipa.chat»."
        },
        {
            "name": "Recurso: Percursos de formação",
            "description": "Percursos de formação — módulo «equipa.chat»."
        },
        {
            "name": "Recurso: Perguntas dos testes",
            "description": "Perguntas dos testes — módulo «equipa.chat»."
        },
        {
            "name": "Recurso: Acessos de emergência",
            "description": "Acessos de emergência — módulo «admin.auditoria»."
        },
        {
            "name": "Recurso: Pedidos do agente",
            "description": "Pedidos do agente — módulo «crm.agente»."
        },
        {
            "name": "Recurso: Conversas de teste",
            "description": "Conversas de teste — módulo «crm.agente»."
        },
        {
            "name": "Recurso: Alertas de acesso",
            "description": "Alertas de acesso — módulo «admin.auditoria»."
        },
        {
            "name": "Recurso: Clientes de integração",
            "description": "Clientes de integração — módulo «admin.definicoes»."
        },
        {
            "name": "Recurso: Artigos",
            "description": "Artigos — módulo «stock»."
        },
        {
            "name": "Recurso: Preços de fornecedor",
            "description": "Preços de fornecedor — módulo «stock»."
        },
        {
            "name": "Recurso: Registo das atividades de tratamento",
            "description": "Registo das atividades de tratamento — módulo «conformidade»."
        },
        {
            "name": "Recurso: Ausências e férias",
            "description": "Ausências e férias — módulo «agenda»."
        },
        {
            "name": "Recurso: Avisos mostrados",
            "description": "Avisos mostrados — módulo «conformidade»."
        },
        {
            "name": "Recurso: Avisos de privacidade",
            "description": "Avisos de privacidade — módulo «conformidade»."
        },
        {
            "name": "Recurso: Base de conhecimento",
            "description": "Base de conhecimento — módulo «crm.agente»."
        },
        {
            "name": "Recurso: Caixas",
            "description": "Caixas — módulo «financeiro.pagamentos»."
        },
        {
            "name": "Recurso: Campanhas",
            "description": "Campanhas — módulo «marketing»."
        },
        {
            "name": "Recurso: Listas de chamadas",
            "description": "Listas de chamadas — módulo «crm.telefonia»."
        },
        {
            "name": "Recurso: Capturas",
            "description": "Capturas — módulo «ficha.captura»; leitura de dados clínicos auditada."
        },
        {
            "name": "Recurso: Casos publicados",
            "description": "Casos publicados — módulo «site.cms»."
        },
        {
            "name": "Recurso: Chamadas",
            "description": "Chamadas — módulo «crm.telefonia»."
        },
        {
            "name": "Recurso: Checklists de segurança",
            "description": "Checklists de segurança — módulo «bloco.registo»."
        },
        {
            "name": "Recurso: Cirurgias",
            "description": "Cirurgias — módulo «bloco.mapa»."
        },
        {
            "name": "Recurso: Clínicas",
            "description": "Clínicas — módulo «admin.definicoes»."
        },
        {
            "name": "Recurso: Blocos do site",
            "description": "Blocos do site — módulo «site.cms»."
        },
        {
            "name": "Recurso: Páginas do site",
            "description": "Páginas do site — módulo «site.cms»."
        },
        {
            "name": "Recurso: Códigos de desconto",
            "description": "Códigos de desconto — módulo «comercial.descontos»."
        },
        {
            "name": "Recurso: Comissões",
            "description": "Comissões — módulo «financeiro.valores»."
        },
        {
            "name": "Recurso: Regras de comissões",
            "description": "Regras de comissões — módulo «financeiro.valores»."
        },
        {
            "name": "Recurso: Complicações",
            "description": "Complicações — módulo «ficha.clinica»; leitura de dados clínicos auditada."
        },
        {
            "name": "Recurso: Comunicados",
            "description": "Comunicados — módulo «equipa.chat»."
        },
        {
            "name": "Recurso: Modelos de consentimento",
            "description": "Modelos de consentimento — módulo «documentos»."
        },
        {
            "name": "Recurso: Registo de consentimentos",
            "description": "Registo de consentimentos — módulo «ficha.consentimentos»."
        },
        {
            "name": "Recurso: Prazos de conservação",
            "description": "Prazos de conservação — módulo «conformidade»."
        },
        {
            "name": "Recurso: Consultas",
            "description": "Consultas — módulo «ficha.clinica»; leitura de dados clínicos auditada."
        },
        {
            "name": "Recurso: Contas pagadoras",
            "description": "Contas pagadoras — módulo «financeiro.pagamentos»."
        },
        {
            "name": "Recurso: Subcontas",
            "description": "Subcontas — módulo «financeiro.pagamentos»."
        },
        {
            "name": "Recurso: Convenções",
            "description": "Convenções — módulo «financeiro.pagamentos»."
        },
        {
            "name": "Recurso: Atos da convenção",
            "description": "Atos da convenção — módulo «financeiro.pagamentos»."
        },
        {
            "name": "Recurso: Conversas",
            "description": "Conversas — módulo «crm.atendimento»."
        },
        {
            "name": "Recurso: Cuidados por fase",
            "description": "Cuidados por fase — módulo «acompanhamento»."
        },
        {
            "name": "Recurso: Custos de anúncios",
            "description": "Custos de anúncios — módulo «marketing»."
        },
        {
            "name": "Recurso: Datas especiais",
            "description": "Datas especiais — módulo «marketing»."
        },
        {
            "name": "Recurso: Delegações",
            "description": "Delegações — módulo «admin.utilizadores»."
        },
        {
            "name": "Recurso: Diagnósticos de apoio",
            "description": "Diagnósticos de apoio — módulo «clinico.parametros»."
        },
        {
            "name": "Recurso: Modelos de documento",
            "description": "Modelos de documento — módulo «documentos»."
        },
        {
            "name": "Recurso: Documentos emitidos",
            "description": "Documentos emitidos — módulo «documentos»."
        },
        {
            "name": "Recurso: Documentos fiscais",
            "description": "Documentos fiscais — módulo «financeiro.pagamentos»."
        },
        {
            "name": "Recurso: Encomendas",
            "description": "Encomendas — módulo «stock»."
        },
        {
            "name": "Recurso: Episódios",
            "description": "Episódios — módulo «ficha.clinica»."
        },
        {
            "name": "Recurso: Equipa dos episódios",
            "description": "Equipa dos episódios — módulo «ficha.clinica»."
        },
        {
            "name": "Recurso: Equipamentos",
            "description": "Equipamentos — módulo «conformidade»."
        },
        {
            "name": "Recurso: Manutenções e registos",
            "description": "Manutenções e registos — módulo «conformidade»."
        },
        {
            "name": "Recurso: Equipas",
            "description": "Equipas — módulo «admin.utilizadores»."
        },
        {
            "name": "Recurso: Feriados",
            "description": "Feriados — módulo «agenda»."
        },
        {
            "name": "Recurso: Formação da equipa",
            "description": "Formação da equipa — módulo «conformidade»."
        },
        {
            "name": "Recurso: Formulários",
            "description": "Formulários — módulo «ficha.clinica»."
        },
        {
            "name": "Recurso: Respostas a formulários",
            "description": "Respostas a formulários — módulo «ficha.clinica»; leitura de dados clínicos auditada."
        },
        {
            "name": "Recurso: Fotografias",
            "description": "Fotografias — módulo «ficha.fotografias»; leitura de dados clínicos auditada."
        },
        {
            "name": "Recurso: Fases do funil",
            "description": "Fases do funil — módulo «crm.leads»."
        },
        {
            "name": "Recurso: Funis por mercado",
            "description": "Funis por mercado — módulo «crm.leads»."
        },
        {
            "name": "Recurso: Guiões",
            "description": "Guiões — módulo «crm.telefonia»."
        },
        {
            "name": "Recurso: Honorários",
            "description": "Honorários — módulo «financeiro.valores»."
        },
        {
            "name": "Recurso: Horários",
            "description": "Horários — módulo «agenda»."
        },
        {
            "name": "Recurso: Pedidos de IA",
            "description": "Pedidos de IA — módulo «admin.definicoes»."
        },
        {
            "name": "Recurso: Propostas da IA",
            "description": "Propostas da IA — módulo «ficha.clinica»; leitura de dados clínicos auditada."
        },
        {
            "name": "Recurso: Biblioteca de imagens",
            "description": "Biblioteca de imagens — módulo «marketing»."
        },
        {
            "name": "Recurso: Importações",
            "description": "Importações — módulo «ficha.identificacao»."
        },
        {
            "name": "Recurso: Incidentes de segurança",
            "description": "Incidentes de segurança — módulo «conformidade»."
        },
        {
            "name": "Recurso: Itinerários",
            "description": "Itinerários — módulo «agenda»."
        },
        {
            "name": "Recurso: Leads",
            "description": "Leads — módulo «crm.leads»."
        },
        {
            "name": "Recurso: Lista de espera",
            "description": "Lista de espera — módulo «agenda»."
        },
        {
            "name": "Recurso: Locais",
            "description": "Locais — módulo «admin.definicoes»."
        },
        {
            "name": "Recurso: Tipos de marcação",
            "description": "Tipos de marcação — módulo «agenda»."
        },
        {
            "name": "Recurso: Marcações",
            "description": "Marcações — módulo «agenda»."
        },
        {
            "name": "Recurso: Marcos de acompanhamento",
            "description": "Marcos de acompanhamento — módulo «acompanhamento»; leitura de dados clínicos auditada."
        },
        {
            "name": "Recurso: Modelos 3D",
            "description": "Modelos 3D — módulo «ficha.captura»; leitura de dados clínicos auditada."
        },
        {
            "name": "Recurso: Versões do motor",
            "description": "Versões do motor — módulo «clinico.parametros»."
        },
        {
            "name": "Recurso: Objetivos comerciais",
            "description": "Objetivos comerciais — módulo «crm.leads»."
        },
        {
            "name": "Recurso: Pacientes",
            "description": "Pacientes — módulo «ficha.identificacao»."
        },
        {
            "name": "Recurso: Alertas clínicos",
            "description": "Alertas clínicos — módulo «ficha.clinica»; leitura de dados clínicos auditada."
        },
        {
            "name": "Recurso: Pagamentos",
            "description": "Pagamentos — módulo «financeiro.pagamentos»."
        },
        {
            "name": "Recurso: Parceiros",
            "description": "Parceiros — módulo «crm.leads»."
        },
        {
            "name": "Recurso: Encaminhamentos de parceiros",
            "description": "Encaminhamentos de parceiros — módulo «crm.leads»."
        },
        {
            "name": "Recurso: Pedidos dos titulares",
            "description": "Pedidos dos titulares — módulo «conformidade»."
        },
        {
            "name": "Recurso: Perfis",
            "description": "Perfis — módulo «admin.utilizadores»."
        },
        {
            "name": "Recurso: Planos cirúrgicos",
            "description": "Planos cirúrgicos — módulo «ficha.plano»; leitura de dados clínicos auditada."
        },
        {
            "name": "Recurso: Contas do portal",
            "description": "Contas do portal — módulo «ficha.identificacao»."
        },
        {
            "name": "Recurso: Pedidos do portal",
            "description": "Pedidos do portal — módulo «ficha.identificacao»."
        },
        {
            "name": "Recurso: Pré-avaliações",
            "description": "Pré-avaliações — módulo «crm.atendimento»."
        },
        {
            "name": "Recurso: Procedimentos",
            "description": "Procedimentos — módulo «financeiro.pagamentos»."
        },
        {
            "name": "Recurso: Propostas",
            "description": "Propostas — módulo «comercial.propostas»."
        },
        {
            "name": "Recurso: Protocolos fotográficos",
            "description": "Protocolos fotográficos — módulo «ficha.captura»."
        },
        {
            "name": "Recurso: Públicos para anúncios",
            "description": "Públicos para anúncios — módulo «marketing»."
        },
        {
            "name": "Recurso: Reclamações, elogios e sugestões",
            "description": "Reclamações, elogios e sugestões — módulo «conformidade»."
        },
        {
            "name": "Recurso: Salas, equipamentos e intérpretes",
            "description": "Salas, equipamentos e intérpretes — módulo «agenda»."
        },
        {
            "name": "Recurso: Regras de elegibilidade",
            "description": "Regras de elegibilidade — módulo «clinico.parametros»."
        },
        {
            "name": "Recurso: Relatórios agendados",
            "description": "Relatórios agendados — módulo «admin.definicoes»."
        },
        {
            "name": "Recurso: Respostas rápidas",
            "description": "Respostas rápidas — módulo «crm.atendimento»."
        },
        {
            "name": "Recurso: Reuniões",
            "description": "Reuniões — módulo «equipa.chat»."
        },
        {
            "name": "Recurso: Revisões de acessos",
            "description": "Revisões de acessos — módulo «admin.utilizadores»."
        },
        {
            "name": "Recurso: Segmentos",
            "description": "Segmentos — módulo «marketing»."
        },
        {
            "name": "Recurso: Sequências",
            "description": "Sequências — módulo «crm.leads»."
        },
        {
            "name": "Recurso: Movimentos de stock",
            "description": "Movimentos de stock — módulo «stock»."
        },
        {
            "name": "Recurso: Subcontratantes",
            "description": "Subcontratantes — módulo «conformidade»."
        },
        {
            "name": "Recurso: Oposição a contactos",
            "description": "Oposição a contactos — módulo «conformidade»."
        },
        {
            "name": "Recurso: Tabelas de preços",
            "description": "Tabelas de preços — módulo «financeiro.pagamentos»."
        },
        {
            "name": "Recurso: Tarefas",
            "description": "Tarefas — módulo «equipa.tarefas»."
        },
        {
            "name": "Recurso: Teleconsultas",
            "description": "Teleconsultas — módulo «teleconsulta»; leitura de dados clínicos auditada."
        },
        {
            "name": "Recurso: Extensões",
            "description": "Extensões — módulo «crm.telefonia»."
        },
        {
            "name": "Recurso: Números da clínica",
            "description": "Números da clínica — módulo «crm.telefonia»."
        },
        {
            "name": "Recurso: Terminais de pagamento",
            "description": "Terminais de pagamento — módulo «financeiro.pagamentos»."
        },
        {
            "name": "Recurso: Tratamentos complementares",
            "description": "Tratamentos complementares — módulo «acompanhamento»; leitura de dados clínicos auditada."
        },
        {
            "name": "Recurso: Campos de tricoscopia",
            "description": "Campos de tricoscopia — módulo «ficha.captura»; leitura de dados clínicos auditada."
        },
        {
            "name": "Recurso: Utilizadores",
            "description": "Utilizadores — módulo «admin.utilizadores»."
        },
        {
            "name": "Recurso: Vales de oferta",
            "description": "Vales de oferta — módulo «financeiro.pagamentos»."
        },
        {
            "name": "Recurso: Mensagens gravadas",
            "description": "Mensagens gravadas — módulo «crm.telefonia»."
        },
        {
            "name": "Recurso: Menus de voz",
            "description": "Menus de voz — módulo «crm.telefonia»."
        },
        {
            "name": "Recurso: Webhooks",
            "description": "Webhooks — módulo «admin.definicoes»."
        },
        {
            "name": "Recurso: Entregas de webhooks",
            "description": "Entregas de webhooks — módulo «admin.definicoes»."
        },
        {
            "name": "Recurso: Linhas de WhatsApp",
            "description": "Linhas de WhatsApp — módulo «admin.definicoes»."
        }
    ],
    "paths": {
        "/academia": {
            "get": {
                "tags": [
                    "Academia"
                ],
                "operationId": "painelAcademia",
                "summary": "A minha academia",
                "description": "Percursos do perfil (progresso, prazo, atraso), cursos publicados para a pessoa, certificados e indicadores. «gerir» indica se a pessoa gere a academia.",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "kpis": {
                                                    "type": "object"
                                                },
                                                "percursos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "cursos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "certificados": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "categorias": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "gerir": {
                                                    "type": "boolean"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "kpis": {
                                            "cursos": 6,
                                            "concluidos": 2,
                                            "em_curso": 1,
                                            "certificados": 2,
                                            "em_atraso": 0
                                        },
                                        "percursos": [],
                                        "cursos": [],
                                        "certificados": [],
                                        "categorias": [],
                                        "gerir": false
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/academia/certificados/{codigo}": {
            "get": {
                "tags": [
                    "Academia"
                ],
                "operationId": "obterCertificadoAcademia",
                "summary": "Certificado (com verificação)",
                "description": "Da própria pessoa ou, para quem gere, de qualquer pessoa da clínica. «integro» confirma a assinatura do certificado.",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "codigo",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^AX-[A-F0-9]{4}-[A-F0-9]{4}$"
                        },
                        "example": "AX-1A2B-3C4D"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "codigo": {
                                                    "type": "string"
                                                },
                                                "pessoa": {
                                                    "type": "string"
                                                },
                                                "curso": {
                                                    "type": "string"
                                                },
                                                "nota": {
                                                    "type": "integer"
                                                },
                                                "emitido_em": {
                                                    "type": "string"
                                                },
                                                "valido_ate": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "revogado": {
                                                    "type": "boolean"
                                                },
                                                "expirado": {
                                                    "type": "boolean"
                                                },
                                                "integro": {
                                                    "type": "boolean"
                                                },
                                                "valido": {
                                                    "type": "boolean"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/academia/cursos/{id}": {
            "get": {
                "tags": [
                    "Academia"
                ],
                "operationId": "obterCursoAcademia",
                "summary": "Curso, lições e teste",
                "description": "Lições com texto, vídeo e ficheiro (ligações assinadas de 60 min) e o teste SEM as respostas certas.",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador do curso"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CursoAcademia"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/academia/cursos/{id}/licoes/{licao}/concluir": {
            "post": {
                "tags": [
                    "Academia"
                ],
                "operationId": "concluirLicaoAcademia",
                "summary": "Marcar uma lição como feita",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador do curso"
                    },
                    {
                        "name": "licao",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador da lição"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CursoAcademia"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/academia/cursos/{id}/teste": {
            "post": {
                "tags": [
                    "Academia"
                ],
                "operationId": "entregarTesteAcademia",
                "summary": "Entregar o teste",
                "description": "Corrige, regista a tentativa e, com a nota mínima, emite o certificado. Devolve a correção (certas e explicação) por pergunta. 409 se faltarem lições obrigatórias.",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador do curso"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "respostas"
                                ],
                                "properties": {
                                    "respostas": {
                                        "type": "object",
                                        "additionalProperties": {
                                            "type": "array",
                                            "items": {
                                                "type": "integer"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "respostas": {
                                    "31": [
                                        1
                                    ],
                                    "32": [
                                        0,
                                        2
                                    ]
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "nota": {
                                                    "type": "integer"
                                                },
                                                "aprovado": {
                                                    "type": "boolean"
                                                },
                                                "acertos": {
                                                    "type": "integer"
                                                },
                                                "total": {
                                                    "type": "integer"
                                                },
                                                "nota_minima": {
                                                    "type": "integer"
                                                },
                                                "correcao": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "certificado": {
                                                    "type": [
                                                        "object",
                                                        "null"
                                                    ]
                                                },
                                                "curso": {
                                                    "$ref": "#/components/schemas/CursoAcademia"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "nota": 100,
                                        "aprovado": true,
                                        "acertos": 2,
                                        "total": 2,
                                        "nota_minima": 80,
                                        "correcao": [],
                                        "certificado": {
                                            "codigo": "AX-1A2B-3C4D"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/academia/equipa": {
            "get": {
                "tags": [
                    "Academia"
                ],
                "operationId": "equipaAcademia",
                "summary": "Progresso da equipa (quem gere)",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "pessoas": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "integer"
                                                            },
                                                            "nome": {
                                                                "type": "string"
                                                            },
                                                            "perfil": {
                                                                "type": "string"
                                                            },
                                                            "obrigatorios": {
                                                                "type": "integer"
                                                            },
                                                            "concluidos": {
                                                                "type": "integer"
                                                            },
                                                            "pct": {
                                                                "type": "integer"
                                                            }
                                                        }
                                                    }
                                                },
                                                "cursos_obrigatorios": {
                                                    "type": "integer"
                                                },
                                                "em_dia": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/acompanhamento/marcos/{id}": {
            "get": {
                "tags": [
                    "Acompanhamento"
                ],
                "operationId": "detalheMarco",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "ver",
                "summary": "Detalhe do marco",
                "description": "Fotografias vs dia 0 (com ficha.fotografias), questionário, NPS, circuito fechado planeado/projetado/obtido por zona (com ficha.plano ou ficha.captura), métricas ao longo do tempo (com ficha.captura) e tratamentos (prescrição só com ficha.clinica).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/DetalheMarco"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            },
            "put": {
                "tags": [
                    "Acompanhamento"
                ],
                "operationId": "gravarMarco",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "editar",
                "summary": "Gravar NPS, medições e ligações",
                "description": "densidade_obtida, densidades_zona e metricas exigem ficha.captura:editar; notas exigem ficha.clinica.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "nps": {
                                        "type": "integer",
                                        "minimum": 0,
                                        "maximum": 10
                                    },
                                    "densidade_obtida": {
                                        "type": "number",
                                        "x-unidade": "UF/cm²"
                                    },
                                    "densidades_zona": {
                                        "type": "object",
                                        "additionalProperties": {
                                            "type": "number"
                                        },
                                        "x-unidade": "UF/cm²"
                                    },
                                    "metricas": {
                                        "type": "object",
                                        "properties": {
                                            "racio_terminal_vellus": {
                                                "type": "number"
                                            },
                                            "calibre_mm": {
                                                "type": "number"
                                            },
                                            "pct_terminais": {
                                                "type": "number"
                                            }
                                        }
                                    },
                                    "notas": {
                                        "type": "string"
                                    },
                                    "data_prevista": {
                                        "type": "string",
                                        "format": "date"
                                    },
                                    "captura_id": {
                                        "type": "integer"
                                    },
                                    "marcacao_id": {
                                        "type": "integer"
                                    },
                                    "resposta_id": {
                                        "type": "integer"
                                    }
                                }
                            },
                            "example": {
                                "nps": 9,
                                "densidades_zona": {
                                    "linha_frontal": 23.4,
                                    "coroa": 17.8
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/DetalheMarco"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/acompanhamento/marcos/{id}/estado": {
            "post": {
                "tags": [
                    "Acompanhamento"
                ],
                "operationId": "estadoMarco",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "editar",
                "summary": "Mudar o estado (quadro)",
                "description": "«falhado» cria uma tarefa de recuperação para a receção; «concluido» dispara o webhook marco.concluido.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "estado": {
                                        "type": "string",
                                        "enum": [
                                            "pendente",
                                            "fotos_enviadas",
                                            "revisto",
                                            "concluido",
                                            "em_atraso",
                                            "falhado"
                                        ]
                                    },
                                    "ordem": {
                                        "type": "integer"
                                    }
                                },
                                "required": [
                                    "estado"
                                ]
                            },
                            "example": {
                                "estado": "revisto",
                                "ordem": 0
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "estado": {
                                                    "type": "string"
                                                },
                                                "tarefa_id": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/acompanhamento/marcos/{id}/pedir-fotos": {
            "post": {
                "tags": [
                    "Acompanhamento"
                ],
                "operationId": "pedirFotosMarco",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "editar",
                "summary": "Pedir as fotografias do marco ao paciente",
                "description": "Notificação no portal e mensagem de serviço (canal das Definições), na língua do paciente e sem pormenores clínicos.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "estado": {
                                                    "type": "string"
                                                },
                                                "enviado": {
                                                    "type": "boolean"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/acompanhamento/marcos/{id}/recuperacao": {
            "post": {
                "tags": [
                    "Acompanhamento"
                ],
                "operationId": "recuperacaoMarco",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "editar",
                "summary": "Tarefa de recuperação para a receção",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "nota": {
                                        "type": "string",
                                        "maxLength": 500
                                    }
                                }
                            },
                            "example": {
                                "nota": "Sem resposta às mensagens do mês 2."
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "tarefa_id": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "tarefa_id": 4410
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/acompanhamento/quadro": {
            "get": {
                "tags": [
                    "Acompanhamento"
                ],
                "operationId": "quadroAcompanhamento",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "ver",
                "summary": "Quadro de marcos",
                "description": "Colunas por estado com cartões (paciente, marco, data prevista, dias, em atraso, NPS, fotografias por verificar), KPIs. Concluídos/falhados só dos últimos 60 dias.",
                "parameters": [
                    {
                        "name": "marco",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "d1",
                                "s1",
                                "m1",
                                "m2",
                                "m6",
                                "m9",
                                "m12",
                                "m18"
                            ]
                        },
                        "description": "Marco"
                    },
                    {
                        "name": "paciente_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Paciente"
                    },
                    {
                        "name": "de",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Desde"
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Até"
                    },
                    {
                        "name": "so_atraso",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "enum": [
                                0,
                                1
                            ]
                        },
                        "description": "Só em atraso"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/QuadroMarcos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/agenda/calendarios": {
            "get": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6CalendariosEstado",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "ver",
                "summary": "Calendários externos do profissional",
                "description": "Google Calendar e Microsoft 365: se estão ativos na clínica e a ligação da pessoa (estado, conta mascarada, preferências, última sincronização, contagens). Os testemunhos nunca saem do servidor.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "fornecedores": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "detalhe": {
                                                    "type": "string",
                                                    "enum": [
                                                        "tipo",
                                                        "ocupado"
                                                    ]
                                                },
                                                "janela_dias": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "fornecedores": [
                                            {
                                                "chave": "google",
                                                "rotulo": "Google Calendar",
                                                "configurado": true,
                                                "ligacao": {
                                                    "id": 3,
                                                    "fornecedor": "google",
                                                    "conta": "in••••@clinica.pt",
                                                    "estado": "ativa",
                                                    "estado_rotulo": "Ligado",
                                                    "subir_marcacoes": true,
                                                    "bloquear_agenda": true,
                                                    "sincronizado_em": "2026-11-03T09:40:00+00:00",
                                                    "ultimo_erro": null,
                                                    "ocupados_lidos": 7,
                                                    "marcacoes_enviadas": 21
                                                }
                                            },
                                            {
                                                "chave": "microsoft",
                                                "rotulo": "Microsoft 365",
                                                "configurado": false,
                                                "ligacao": null
                                            }
                                        ],
                                        "detalhe": "tipo",
                                        "janela_dias": 60
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/calendarios/sincronizar": {
            "post": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6CalendariosSincronizar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "ver",
                "summary": "Sincronizar agora",
                "description": "Sincroniza as ligações da pessoa nos dois sentidos (o agendador fá-lo a cada 10 minutos). Lê só início e fim dos compromissos «ocupado»; envia/atualiza/apaga as marcações dos próximos dias. Limite: 10 por 10 minutos.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "resultado": {
                                                    "type": "object"
                                                },
                                                "fornecedores": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/calendarios/{fornecedor}/desligar": {
            "post": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6CalendariosDesligar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "fornecedor",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "google",
                                "microsoft"
                            ]
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "ver",
                "summary": "Desligar o calendário",
                "description": "Apaga no calendário externo as marcações enviadas (por omissão), revoga a autorização quando o fornecedor o permite, apaga os testemunhos e os blocos lidos. Efeitos: auditoria.",
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "apagar_eventos": {
                                        "type": "boolean"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/calendarios/{fornecedor}/ligar": {
            "post": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6CalendariosLigar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "fornecedor",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "google",
                                "microsoft"
                            ]
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "ver",
                "summary": "Começar a ligação (OAuth)",
                "description": "Devolve o endereço de autorização do fornecedor (OAuth 2.0 com PKCE, estado de uso único válido 10 minutos). A app abre-o no navegador do sistema; o fornecedor regressa a /agenda/calendarios/retorno/{fornecedor}, que guarda os testemunhos cifrados e faz a primeira sincronização. 422 «nao_configurado» se a clínica não ativou o fornecedor; 422 «ambiente» fora de produção sem o canal autorizado. Limite: 10 por 10 minutos.",
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "url": {
                                                    "type": "string",
                                                    "format": "uri"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "url": "https://accounts.google.com/o/oauth2/v2/auth?client_id=…&state=…&code_challenge=…"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/calendarios/{fornecedor}/preferencias": {
            "post": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6CalendariosPreferencias",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "fornecedor",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "google",
                                "microsoft"
                            ]
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "ver",
                "summary": "Preferências da ligação",
                "description": "«subir_marcacoes»: enviar as marcações (sem dados de pacientes); «bloquear_agenda»: os compromissos externos tiram vagas e geram conflitos.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "subir_marcacoes": {
                                        "type": "boolean"
                                    },
                                    "bloquear_agenda": {
                                        "type": "boolean"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/configuracao": {
            "get": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6AgendaConfiguracao",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "ver",
                "summary": "Configuração do calendário",
                "description": "Tipos de marcação ativos (duração, cor, margens, teleconsulta, cirurgia, sala obrigatória, sinal, marcação online), profissionais da agenda (com horário ou de perfil clínico), equipa ativa, salas, equipamentos, intérpretes, horas de início e fim do calendário (Definições › Agenda), estados com rótulo e tom, e se quem pede pode editar. Sem efeitos.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6ConfiguracaoAgenda"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "tipos": [
                                            {
                                                "id": 3,
                                                "chave": "avaliacao",
                                                "nome": "Consulta de avaliação",
                                                "duracao_min": 45,
                                                "cor": "#2F6F62",
                                                "teleconsulta": false,
                                                "cirurgia": false,
                                                "sala_obrigatoria": true,
                                                "exige_sinal": false,
                                                "margem_antes_min": 0,
                                                "margem_depois_min": 10,
                                                "online": true
                                            },
                                            {
                                                "id": 4,
                                                "chave": "teleconsulta",
                                                "nome": "Teleconsulta",
                                                "duracao_min": 30,
                                                "cor": "#3A7BC0",
                                                "teleconsulta": true,
                                                "cirurgia": false,
                                                "sala_obrigatoria": false,
                                                "exige_sinal": false,
                                                "margem_antes_min": 0,
                                                "margem_depois_min": 0,
                                                "online": true
                                            },
                                            {
                                                "id": 9,
                                                "chave": "cirurgia",
                                                "nome": "Cirurgia",
                                                "duracao_min": 360,
                                                "cor": "#8C2F39",
                                                "teleconsulta": false,
                                                "cirurgia": true,
                                                "sala_obrigatoria": true,
                                                "exige_sinal": true,
                                                "margem_antes_min": 30,
                                                "margem_depois_min": 45,
                                                "online": false
                                            }
                                        ],
                                        "profissionais": [
                                            {
                                                "id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "perfil": "medico",
                                                "departamento": "medico"
                                            }
                                        ],
                                        "equipa": [
                                            {
                                                "id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "perfil": "medico",
                                                "departamento": "medico"
                                            },
                                            {
                                                "id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "perfil": "tecnico",
                                                "departamento": "tecnico"
                                            }
                                        ],
                                        "salas": [
                                            {
                                                "id": 12,
                                                "nome": "Gabinete 2",
                                                "cor": "#5B6770",
                                                "idioma": null,
                                                "bloco": false,
                                                "capacidade": 1
                                            },
                                            {
                                                "id": 5,
                                                "nome": "Bloco 1",
                                                "cor": "#8C2F39",
                                                "idioma": null,
                                                "bloco": true,
                                                "capacidade": 1
                                            }
                                        ],
                                        "equipamentos": [
                                            {
                                                "id": 21,
                                                "nome": "Tricoscópio digital",
                                                "cor": null,
                                                "idioma": null,
                                                "bloco": false,
                                                "capacidade": 1
                                            }
                                        ],
                                        "interpretes": [
                                            {
                                                "id": 30,
                                                "nome": "Intérprete de francês",
                                                "cor": null,
                                                "idioma": "fr",
                                                "bloco": false,
                                                "capacidade": 1
                                            }
                                        ],
                                        "hora_inicio": 8,
                                        "hora_fim": 20,
                                        "estados": [
                                            {
                                                "valor": "pedido",
                                                "rotulo": "Pedido",
                                                "tom": "ouro"
                                            },
                                            {
                                                "valor": "marcada",
                                                "rotulo": "Por confirmar",
                                                "tom": "aviso"
                                            },
                                            {
                                                "valor": "confirmada",
                                                "rotulo": "Confirmada",
                                                "tom": "sucesso"
                                            }
                                        ],
                                        "pode_editar": true
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/disponibilidade": {
            "get": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6AgendaDisponibilidade",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "ver",
                "summary": "Vagas livres de um tipo de marcação",
                "description": "Calcula no servidor as vagas entre «de» e «ate» (máximo 31 dias), opcionalmente de um profissional: horários que admitem o tipo, ausências aprovadas, feriados, marcações existentes com as margens, antecedência mínima do tipo (e pelo menos 5 minutos) e sala livre quando o tipo exige sala ou é de cirurgia. Passo e número máximo de vagas em Definições › Agenda (15 min e 300 por omissão). Ordenadas por hora. Sem efeitos.",
                "parameters": [
                    {
                        "name": "tipo_id",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Tipo de marcação (obrigatório)."
                    },
                    {
                        "name": "de",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Primeiro dia (por omissão hoje)."
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Último dia (por omissão hoje + 14 dias)."
                    },
                    {
                        "name": "profissional_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Só as vagas deste profissional."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/M6Vaga"
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "total": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "inicio": "2026-11-03T11:00:00+00:00",
                                            "fim": "2026-11-03T11:45:00+00:00",
                                            "profissional_id": 7,
                                            "profissional_nome": "Inês Valente",
                                            "sala_id": 12,
                                            "sala_nome": "Gabinete 2"
                                        },
                                        {
                                            "inicio": "2026-11-03T11:15:00+00:00",
                                            "fim": "2026-11-03T12:00:00+00:00",
                                            "profissional_id": 7,
                                            "profissional_nome": "Inês Valente",
                                            "sala_id": 12,
                                            "sala_nome": "Gabinete 2"
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/eventos": {
            "get": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6AgendaEventos",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "ver",
                "summary": "Eventos do calendário entre duas datas",
                "description": "Marcações no âmbito de quem pede (âmbito «próprios»: as suas marcações e as dos seus pacientes), margens de preparação e limpeza dos tipos, ausências aprovadas e feriados. Sem filtro de estado, as canceladas e remarcadas ficam de fora. Intervalo máximo de 62 dias (por omissão hoje → +7 dias). Na API «url» é sempre null e as datas trazem fuso; os feriados vêm só com a data. Até 2000 marcações. meta.total conta todos os eventos devolvidos.",
                "parameters": [
                    {
                        "name": "inicio",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Início do intervalo (AAAA-MM-DD ou ISO 8601)."
                    },
                    {
                        "name": "fim",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Fim do intervalo (exclusivo)."
                    },
                    {
                        "name": "colunas",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "profissional",
                                "sala",
                                "equipamento"
                            ],
                            "default": "profissional"
                        },
                        "description": "O que preenche «recurso» em cada evento. Com «equipamento», cada marcação aparece uma vez por equipamento reservado (id «eq<equipamento>-<id>», a marcação em «marcacao_id», não editável). Com «profissional», os compromissos dos calendários externos ligados vêm como eventos «externo» (só horas, sem pormenores)."
                    },
                    {
                        "name": "cor",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "tipo",
                                "profissional",
                                "estado"
                            ],
                            "default": "tipo"
                        },
                        "description": "Origem da cor do evento (as faltas ficam sempre a vermelho)."
                    },
                    {
                        "name": "f[profissional_id]",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Filtrar por profissional."
                    },
                    {
                        "name": "f[sala_id]",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Filtrar por sala."
                    },
                    {
                        "name": "f[tipo_id]",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Filtrar por tipo de marcação."
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "pedido",
                                "marcada",
                                "confirmada",
                                "em_curso",
                                "concluida",
                                "faltou",
                                "cancelada",
                                "remarcada"
                            ]
                        },
                        "description": "Filtrar por estado."
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Filtrar por paciente."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/M6Evento"
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "total": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 8840,
                                            "titulo": "Rui Almeida",
                                            "subtitulo": "Consulta de avaliação · Gabinete 2 · Por confirmar",
                                            "inicio": "2026-11-03T10:00:00+00:00",
                                            "fim": "2026-11-03T10:45:00+00:00",
                                            "cor": "#2F6F62",
                                            "recurso": 7,
                                            "url": null,
                                            "editavel": true,
                                            "tipo": "marcacao",
                                            "estado": "marcada",
                                            "estado_rotulo": "Por confirmar",
                                            "tipo_id": 3,
                                            "tipo_nome": "Consulta de avaliação",
                                            "tipo_cor": "#2F6F62",
                                            "paciente_id": 1204,
                                            "profissional_id": 7,
                                            "profissional_nome": "Inês Valente",
                                            "profissional_cor": "#7A4E9C",
                                            "sala_id": 12,
                                            "sala_nome": "Gabinete 2",
                                            "teleconsulta": false,
                                            "cirurgia_id": null,
                                            "confirmada": false
                                        },
                                        {
                                            "id": "margem-8840-depois",
                                            "titulo": "Limpeza",
                                            "subtitulo": "Rui Almeida",
                                            "inicio": "2026-11-03T10:45:00+00:00",
                                            "fim": "2026-11-03T10:55:00+00:00",
                                            "cor": "var(--ax-linha-forte)",
                                            "recurso": 7,
                                            "editavel": false,
                                            "tipo": "margem",
                                            "marcacao_id": 8840
                                        },
                                        {
                                            "id": "ausencia-31",
                                            "titulo": "Férias — Marta Sousa",
                                            "inicio": "2026-11-03T00:00:00+00:00",
                                            "fim": "2026-11-07T23:59:00+00:00",
                                            "cor": "var(--ax-linha-forte)",
                                            "recurso": 15,
                                            "editavel": false,
                                            "tipo": "ausencia",
                                            "url": null,
                                            "diaInteiro": true
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/fluxo": {
            "get": {
                "tags": [
                    "Fluxo do dia"
                ],
                "operationId": "m6FluxoDoDia",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "ver",
                "summary": "Quadro do fluxo do dia",
                "description": "Um cartão por marcação do dia (âmbito da agenda) na coluna do seu posto: por chegar, admissão, preparação, extração, implantação, recobro, saída. Inclui o tempo no posto atual, atrasos (por chegar 10 minutos depois da hora) e o resumo com as médias de minutos por posto. As cirurgias avançam de posto automaticamente com as fases do painel cirúrgico.",
                "parameters": [
                    {
                        "name": "data",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Dia (por omissão hoje)."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Fluxo"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "data": "2026-11-03",
                                        "colunas": [
                                            {
                                                "chave": "por_chegar",
                                                "rotulo": "Por chegar",
                                                "cartoes": [
                                                    {
                                                        "id": 8840,
                                                        "nome": "Rui Almeida",
                                                        "nome_curto": "Rui A.",
                                                        "paciente_id": 1204,
                                                        "hora": "10:00",
                                                        "inicio": "2026-11-03T10:00:00+00:00",
                                                        "tipo_nome": "Consulta de avaliação",
                                                        "tipo_cor": "#2F6F62",
                                                        "cirurgia_id": null,
                                                        "profissional_nome": "Inês Valente",
                                                        "profissional_cor": "#7A4E9C",
                                                        "sala_nome": "Gabinete 2",
                                                        "estado": "confirmada",
                                                        "confirmada": true,
                                                        "posto_desde": null,
                                                        "atrasado": false,
                                                        "atraso_minutos": null
                                                    }
                                                ]
                                            },
                                            {
                                                "chave": "admissao",
                                                "rotulo": "Admissão",
                                                "cartoes": []
                                            },
                                            {
                                                "chave": "preparacao",
                                                "rotulo": "Preparação",
                                                "cartoes": []
                                            },
                                            {
                                                "chave": "extracao",
                                                "rotulo": "Extração",
                                                "cartoes": []
                                            },
                                            {
                                                "chave": "implantacao",
                                                "rotulo": "Implantação",
                                                "cartoes": []
                                            },
                                            {
                                                "chave": "recobro",
                                                "rotulo": "Recobro",
                                                "cartoes": []
                                            },
                                            {
                                                "chave": "saida",
                                                "rotulo": "Saída",
                                                "cartoes": []
                                            }
                                        ],
                                        "resumo": {
                                            "total": 14,
                                            "por_chegar": 6,
                                            "em_fluxo": 3,
                                            "saida": 5,
                                            "atrasados": 1,
                                            "medias_min": {
                                                "admissao": 9,
                                                "recobro": 25
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/fluxo/{id}/posto": {
            "post": {
                "tags": [
                    "Fluxo do dia"
                ],
                "operationId": "m6MudarPosto",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da marcação"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "summary": "Mudar o posto de uma marcação",
                "description": "Fecha o posto atual (guarda o tempo) e abre o novo; faz o check-in se ainda não existia. «saida» conclui a marcação; os restantes postos põem-na em curso. «por_chegar» desfaz um engano: limpa o posto e o check-in e volta a confirmada/marcada. Recusado em marcações canceladas, remarcadas ou faltas (409 «estado_invalido»). Efeitos: histórico.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "posto": {
                                        "type": "string",
                                        "enum": [
                                            "por_chegar",
                                            "admissao",
                                            "preparacao",
                                            "extracao",
                                            "implantacao",
                                            "recobro",
                                            "saida"
                                        ]
                                    }
                                },
                                "required": [
                                    "posto"
                                ]
                            },
                            "example": {
                                "posto": "admissao"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "posto": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "enum": [
                                                        "admissao",
                                                        "preparacao",
                                                        "extracao",
                                                        "implantacao",
                                                        "recobro",
                                                        "saida",
                                                        null
                                                    ]
                                                },
                                                "posto_desde": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                },
                                                "estado": {
                                                    "type": "string",
                                                    "enum": [
                                                        "em_curso",
                                                        "concluida"
                                                    ]
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 8840,
                                        "posto": "admissao",
                                        "posto_desde": "2026-11-03T09:56:12+00:00",
                                        "estado": "em_curso"
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Não é possível neste estado."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/lista-espera": {
            "get": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6ListaEspera",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "ver",
                "summary": "Lista de espera ativa",
                "description": "Entradas ativas ou já contactadas (até 100), por prioridade (alta, normal, baixa) e antiguidade. Quando uma vaga se liberta (cancelamento ou remarcação com mais de 1 h de antecedência), o primeiro compatível passa a «contactado» com a hora oferecida e a receção recebe uma tarefa. A gestão das entradas faz-se pelo recurso genérico da lista de espera.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/M6ListaEspera"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 41,
                                            "paciente_id": 1290,
                                            "lead_id": null,
                                            "nome": "Carla Neves",
                                            "tipo_id": 3,
                                            "tipo_nome": "Consulta de avaliação",
                                            "profissional_id": 7,
                                            "preferencias": "Manhãs, terças ou quintas",
                                            "prioridade": "alta",
                                            "estado": "contactado",
                                            "desde": "2026-10-20",
                                            "oferta_inicio": "2026-11-03T10:00:00+00:00"
                                        },
                                        {
                                            "id": 44,
                                            "paciente_id": null,
                                            "lead_id": 512,
                                            "nome": "João Pires",
                                            "tipo_id": 3,
                                            "tipo_nome": "Consulta de avaliação",
                                            "profissional_id": null,
                                            "preferencias": null,
                                            "prioridade": "normal",
                                            "estado": "ativa",
                                            "desde": "2026-10-24",
                                            "oferta_inicio": null
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/marcacoes": {
            "post": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6CriarMarcacao",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "summary": "Criar marcação",
                "description": "Valida os campos (allowlist) e verifica os conflitos no servidor para o intervalo alargado pelas margens do tipo. Bloqueantes (409 «conflito»): profissional ou participante já ocupado, sala acima da capacidade, equipamento ou intérprete reservado, ausência aprovada, antecedência mínima nas marcações com origem portal/site/agente. Avisos (409 «conflito_aviso»): feriado, fora do horário, profissional sem horário, data passada — reenvie com \"forcar\": true para aceitar; os avisos aceites voltam em «avisos». Efeitos: histórico da marcação, auditoria, evento na linha do tempo do paciente/lead, notificação ao profissional (quando não é quem marca), pedido de sinal no módulo comercial quando o tipo o exige, teleconsulta criada quando o tipo é de teleconsulta, entrada da lista de espera passada a «marcado» e webhook marcacao.criada.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "paciente_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "description": "Paciente. Obrigatório quando não há lead_id."
                                    },
                                    "lead_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "description": "Lead (contacto comercial ainda sem ficha de paciente)."
                                    },
                                    "tipo_id": {
                                        "type": "integer",
                                        "description": "Tipo de marcação ativo (GET /agenda/configuracao → tipos)."
                                    },
                                    "inicio": {
                                        "type": "string",
                                        "format": "date-time",
                                        "description": "Início (ISO 8601; sem fuso é a hora local da clínica)."
                                    },
                                    "fim": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date-time",
                                        "description": "Fim. Por omissão: início + duração do tipo. Máximo 16 h."
                                    },
                                    "profissional_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "description": "Profissional responsável. Obrigatório exceto em tipos de cirurgia."
                                    },
                                    "sala_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "description": "Sala (recurso do tipo «sala»). Obrigatória quando o tipo a exige."
                                    },
                                    "recursos": {
                                        "type": "array",
                                        "items": {
                                            "type": "integer"
                                        },
                                        "description": "Equipamentos e intérpretes (ids de recursos que não são salas)."
                                    },
                                    "participantes": {
                                        "type": "array",
                                        "items": {
                                            "oneOf": [
                                                {
                                                    "type": "integer"
                                                },
                                                {
                                                    "type": "object",
                                                    "required": [
                                                        "utilizador_id"
                                                    ],
                                                    "properties": {
                                                        "utilizador_id": {
                                                            "type": "integer"
                                                        },
                                                        "papel": {
                                                            "type": "string",
                                                            "pattern": "^[a-z_]{2,30}$",
                                                            "default": "assistente"
                                                        }
                                                    }
                                                }
                                            ]
                                        },
                                        "description": "Outras pessoas da equipa (ids ou {utilizador_id, papel})."
                                    },
                                    "origem": {
                                        "type": "string",
                                        "enum": [
                                            "equipa",
                                            "portal",
                                            "site",
                                            "agente",
                                            "telefone"
                                        ],
                                        "default": "equipa",
                                        "description": "Canal de origem. Com portal, site ou agente aplica-se a antecedência mínima do tipo e os avisos passam a bloqueantes."
                                    },
                                    "estado": {
                                        "type": "string",
                                        "enum": [
                                            "pedido",
                                            "marcada",
                                            "confirmada"
                                        ],
                                        "description": "Estado inicial. Por omissão «marcada» («pedido» nas marcações online de tipos com sinal)."
                                    },
                                    "episodio_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "cirurgia_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "notas": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "maxLength": 2000,
                                        "description": "Notas administrativas (nunca clínicas)."
                                    },
                                    "lista_espera_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "description": "Entrada da lista de espera que esta marcação satisfaz (passa a «marcado»)."
                                    },
                                    "remarcada_de": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "permitir_passado": {
                                        "type": "boolean",
                                        "description": "Registar uma marcação já decorrida sem o aviso «passado»."
                                    },
                                    "forcar": {
                                        "type": "boolean",
                                        "description": "Aceitar os avisos (conflito_aviso: feriado, fora do horário, sem horário, data passada). Nunca anula conflitos bloqueantes."
                                    }
                                },
                                "required": [
                                    "tipo_id",
                                    "inicio"
                                ]
                            },
                            "example": {
                                "paciente_id": 1204,
                                "tipo_id": 3,
                                "inicio": "2026-11-03T10:00:00+00:00",
                                "profissional_id": 7,
                                "sala_id": 12,
                                "recursos": [
                                    21
                                ],
                                "participantes": [
                                    {
                                        "utilizador_id": 15,
                                        "papel": "assistente"
                                    }
                                ],
                                "origem": "equipa",
                                "episodio_id": 77,
                                "notas": "Pede para ser contactado depois das 18:00.",
                                "forcar": false
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "avisos": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/M6Conflito"
                                                    },
                                                    "description": "Avisos aceites com «forcar»."
                                                },
                                                "marcacao": {
                                                    "$ref": "#/components/schemas/M6Marcacao"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 8840,
                                        "avisos": [],
                                        "marcacao": {
                                            "id": 8840,
                                            "estado": "marcada",
                                            "estado_rotulo": "Por confirmar",
                                            "estado_tom": "aviso",
                                            "origem": "equipa",
                                            "origem_rotulo": "Equipa",
                                            "inicio": "2026-11-03T10:00:00+00:00",
                                            "fim": "2026-11-03T10:45:00+00:00",
                                            "duracao_min": 45,
                                            "paciente_id": 1204,
                                            "paciente_nome": "Rui Almeida",
                                            "lead_id": null,
                                            "lead_nome": null,
                                            "episodio_id": 77,
                                            "cirurgia_id": null,
                                            "tipo_id": 3,
                                            "tipo_nome": "Consulta de avaliação",
                                            "tipo_cor": "#2F6F62",
                                            "teleconsulta": null,
                                            "profissional_id": 7,
                                            "profissional_nome": "Inês Valente",
                                            "profissional_cor": "#7A4E9C",
                                            "sala_id": 12,
                                            "sala_nome": "Gabinete 2",
                                            "recursos": [
                                                {
                                                    "id": 21,
                                                    "nome": "Tricoscópio digital",
                                                    "tipo": "equipamento"
                                                }
                                            ],
                                            "participantes": [
                                                {
                                                    "utilizador_id": 15,
                                                    "nome": "Marta Sousa",
                                                    "papel": "assistente",
                                                    "cor": "#C0743A"
                                                }
                                            ],
                                            "notas": "Pede para ser contactado depois das 18:00.",
                                            "confirmada_em": null,
                                            "confirmacao_canal": null,
                                            "lembrete_enviado_em": null,
                                            "checkin_em": null,
                                            "posto": null,
                                            "atraso_minutos": null,
                                            "motivo_cancelamento": null,
                                            "remarcada_de": null,
                                            "remarcacoes": [],
                                            "politica": "Cancelamentos com menos de 24 h de antecedência perdem o sinal.",
                                            "historico": [
                                                {
                                                    "acao": "criada",
                                                    "descricao": "Marcada (Equipa)",
                                                    "autor": "Ana Ribeiro",
                                                    "criado_em": "2026-10-28T09:12:44+00:00"
                                                }
                                            ],
                                            "acoes": [
                                                "confirmar",
                                                "remarcar",
                                                "cancelar",
                                                "lembrete"
                                            ]
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (conflito, conflito_aviso, estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "conflito": {
                                        "summary": "conflito",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "conflito",
                                                "mensagem": "Há conflitos na agenda.",
                                                "campos": {
                                                    "profissional_id": "Inês Valente já tem uma marcação das 10:00–10:45.",
                                                    "sala_id": "Gabinete 2 está ocupada (a partir das 10:00)."
                                                }
                                            }
                                        }
                                    },
                                    "conflito_aviso": {
                                        "summary": "conflito_aviso",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "conflito_aviso",
                                                "mensagem": "Há avisos na agenda. Confirme para continuar.",
                                                "campos": {
                                                    "inicio": "É feriado: Implantação da República."
                                                }
                                            }
                                        }
                                    },
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Esta marcação já não pode ser mudada."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/marcacoes/verificar": {
            "post": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6VerificarMarcacao",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "summary": "Verificar conflitos sem gravar",
                "description": "Mesmas regras da criação, sem gravar nada (para mostrar os conflitos ao vivo no formulário). Os erros de validação vêm como conflitos com codigo «validacao», bloqueantes e com o campo. «ignorar» exclui uma marcação existente (a própria, ao mudar). Paciente e profissional não são obrigatórios aqui.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "paciente_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "description": "Paciente. Obrigatório quando não há lead_id."
                                    },
                                    "lead_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "description": "Lead (contacto comercial ainda sem ficha de paciente)."
                                    },
                                    "tipo_id": {
                                        "type": "integer",
                                        "description": "Tipo de marcação ativo (GET /agenda/configuracao → tipos)."
                                    },
                                    "inicio": {
                                        "type": "string",
                                        "format": "date-time",
                                        "description": "Início (ISO 8601; sem fuso é a hora local da clínica)."
                                    },
                                    "fim": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date-time",
                                        "description": "Fim. Por omissão: início + duração do tipo. Máximo 16 h."
                                    },
                                    "profissional_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "description": "Profissional responsável. Obrigatório exceto em tipos de cirurgia."
                                    },
                                    "sala_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "description": "Sala (recurso do tipo «sala»). Obrigatória quando o tipo a exige."
                                    },
                                    "recursos": {
                                        "type": "array",
                                        "items": {
                                            "type": "integer"
                                        },
                                        "description": "Equipamentos e intérpretes (ids de recursos que não são salas)."
                                    },
                                    "participantes": {
                                        "type": "array",
                                        "items": {
                                            "oneOf": [
                                                {
                                                    "type": "integer"
                                                },
                                                {
                                                    "type": "object",
                                                    "required": [
                                                        "utilizador_id"
                                                    ],
                                                    "properties": {
                                                        "utilizador_id": {
                                                            "type": "integer"
                                                        },
                                                        "papel": {
                                                            "type": "string",
                                                            "pattern": "^[a-z_]{2,30}$",
                                                            "default": "assistente"
                                                        }
                                                    }
                                                }
                                            ]
                                        },
                                        "description": "Outras pessoas da equipa (ids ou {utilizador_id, papel})."
                                    },
                                    "origem": {
                                        "type": "string",
                                        "enum": [
                                            "equipa",
                                            "portal",
                                            "site",
                                            "agente",
                                            "telefone"
                                        ],
                                        "default": "equipa",
                                        "description": "Canal de origem. Com portal, site ou agente aplica-se a antecedência mínima do tipo e os avisos passam a bloqueantes."
                                    },
                                    "estado": {
                                        "type": "string",
                                        "enum": [
                                            "pedido",
                                            "marcada",
                                            "confirmada"
                                        ],
                                        "description": "Estado inicial. Por omissão «marcada» («pedido» nas marcações online de tipos com sinal)."
                                    },
                                    "episodio_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "cirurgia_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "notas": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "maxLength": 2000,
                                        "description": "Notas administrativas (nunca clínicas)."
                                    },
                                    "lista_espera_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "description": "Entrada da lista de espera que esta marcação satisfaz (passa a «marcado»)."
                                    },
                                    "remarcada_de": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "permitir_passado": {
                                        "type": "boolean",
                                        "description": "Registar uma marcação já decorrida sem o aviso «passado»."
                                    },
                                    "forcar": {
                                        "type": "boolean",
                                        "description": "Aceitar os avisos (conflito_aviso: feriado, fora do horário, sem horário, data passada). Nunca anula conflitos bloqueantes."
                                    },
                                    "ignorar": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "description": "Marcação a ignorar na verificação."
                                    }
                                },
                                "required": [
                                    "tipo_id",
                                    "inicio"
                                ]
                            },
                            "example": {
                                "tipo_id": 3,
                                "inicio": "2026-11-03T10:00:00+00:00",
                                "profissional_id": 7,
                                "sala_id": 12,
                                "participantes": [
                                    15
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "conflitos": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/M6Conflito"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "conflitos": [
                                            {
                                                "codigo": "pessoa_ocupada",
                                                "mensagem": "Inês Valente já tem uma marcação das 10:00–10:45.",
                                                "bloqueante": true,
                                                "campo": "profissional_id",
                                                "marcacao_id": 8812,
                                                "utilizador_id": 7
                                            },
                                            {
                                                "codigo": "fora_horario",
                                                "mensagem": "Fora do horário de Inês Valente.",
                                                "bloqueante": false,
                                                "campo": "inicio"
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/marcacoes/{id}": {
            "get": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6ObterMarcacao",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "ver",
                "summary": "Detalhe da marcação",
                "description": "Nomes, tipo, recursos, participantes, teleconsulta associada, cadeia de remarcações, política de cancelamento do tipo, histórico (50 linhas) e as ações possíveis para o estado e a permissão de quem pede. Sem conteúdo clínico. Fora do âmbito responde 404. A leitura fica na auditoria.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da marcação"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Marcacao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 8840,
                                        "estado": "marcada",
                                        "estado_rotulo": "Por confirmar",
                                        "estado_tom": "aviso",
                                        "origem": "equipa",
                                        "origem_rotulo": "Equipa",
                                        "inicio": "2026-11-03T10:00:00+00:00",
                                        "fim": "2026-11-03T10:45:00+00:00",
                                        "duracao_min": 45,
                                        "paciente_id": 1204,
                                        "paciente_nome": "Rui Almeida",
                                        "lead_id": null,
                                        "lead_nome": null,
                                        "episodio_id": 77,
                                        "cirurgia_id": null,
                                        "tipo_id": 3,
                                        "tipo_nome": "Consulta de avaliação",
                                        "tipo_cor": "#2F6F62",
                                        "teleconsulta": null,
                                        "profissional_id": 7,
                                        "profissional_nome": "Inês Valente",
                                        "profissional_cor": "#7A4E9C",
                                        "sala_id": 12,
                                        "sala_nome": "Gabinete 2",
                                        "recursos": [
                                            {
                                                "id": 21,
                                                "nome": "Tricoscópio digital",
                                                "tipo": "equipamento"
                                            }
                                        ],
                                        "participantes": [
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "papel": "assistente",
                                                "cor": "#C0743A"
                                            }
                                        ],
                                        "notas": "Pede para ser contactado depois das 18:00.",
                                        "confirmada_em": null,
                                        "confirmacao_canal": null,
                                        "lembrete_enviado_em": null,
                                        "checkin_em": null,
                                        "posto": null,
                                        "atraso_minutos": null,
                                        "motivo_cancelamento": null,
                                        "remarcada_de": null,
                                        "remarcacoes": [],
                                        "politica": "Cancelamentos com menos de 24 h de antecedência perdem o sinal.",
                                        "historico": [
                                            {
                                                "acao": "criada",
                                                "descricao": "Marcada (Equipa)",
                                                "autor": "Ana Ribeiro",
                                                "criado_em": "2026-10-28T09:12:44+00:00"
                                            }
                                        ],
                                        "acoes": [
                                            "confirmar",
                                            "remarcar",
                                            "cancelar",
                                            "lembrete"
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/marcacoes/{id}/estado": {
            "post": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6EstadoMarcacao",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da marcação"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "summary": "Mudar o estado (confirmar, chegou, concluir, faltou, cancelar)",
                "description": "As ações disponíveis em cada momento vêm em M6Marcacao.acoes. confirmar (pedido/marcada → confirmada; webhook marcacao.confirmada). chegou (check-in → em_curso; abre o posto «admissão» no fluxo do dia e notifica o profissional). concluir (→ concluida; posto «saída»). faltou (→ faltou; tarefa «recuperar falta» de prioridade alta para a receção com prazo de 1 dia e evento na linha do tempo; a regra de perda de sinal do tipo vai na tarefa). cancelar (só pedido/marcada/confirmada → cancelada; motivo opcional até 255 caracteres; notifica o profissional, avisa o paciente por email quando Definições › Agenda › avisar alterações está ligada, oferece a vaga ao primeiro compatível da lista de espera — tarefa para a receção — e dispara o webhook marcacao.cancelada). Todas ficam no histórico e na auditoria. Estado incompatível → 409 «estado_invalido».",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "acao": {
                                        "type": "string",
                                        "enum": [
                                            "confirmar",
                                            "chegou",
                                            "concluir",
                                            "faltou",
                                            "cancelar"
                                        ]
                                    },
                                    "motivo": {
                                        "type": "string",
                                        "maxLength": 255,
                                        "description": "Motivo do cancelamento (só com «cancelar»)."
                                    }
                                },
                                "required": [
                                    "acao"
                                ]
                            },
                            "example": {
                                "acao": "confirmar"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6ResultadoEstado"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 8840,
                                        "estado": "confirmada",
                                        "mensagem": "Marcação confirmada. Obrigado!",
                                        "marcacao": {
                                            "id": 8840,
                                            "estado": "confirmada",
                                            "estado_rotulo": "Confirmada",
                                            "estado_tom": "sucesso",
                                            "origem": "equipa",
                                            "origem_rotulo": "Equipa",
                                            "inicio": "2026-11-03T10:00:00+00:00",
                                            "fim": "2026-11-03T10:45:00+00:00",
                                            "duracao_min": 45,
                                            "paciente_id": 1204,
                                            "paciente_nome": "Rui Almeida",
                                            "lead_id": null,
                                            "lead_nome": null,
                                            "episodio_id": 77,
                                            "cirurgia_id": null,
                                            "tipo_id": 3,
                                            "tipo_nome": "Consulta de avaliação",
                                            "tipo_cor": "#2F6F62",
                                            "teleconsulta": null,
                                            "profissional_id": 7,
                                            "profissional_nome": "Inês Valente",
                                            "profissional_cor": "#7A4E9C",
                                            "sala_id": 12,
                                            "sala_nome": "Gabinete 2",
                                            "recursos": [
                                                {
                                                    "id": 21,
                                                    "nome": "Tricoscópio digital",
                                                    "tipo": "equipamento"
                                                }
                                            ],
                                            "participantes": [
                                                {
                                                    "utilizador_id": 15,
                                                    "nome": "Marta Sousa",
                                                    "papel": "assistente",
                                                    "cor": "#C0743A"
                                                }
                                            ],
                                            "notas": "Pede para ser contactado depois das 18:00.",
                                            "confirmada_em": "2026-10-28T10:02:11+00:00",
                                            "confirmacao_canal": "equipa",
                                            "lembrete_enviado_em": null,
                                            "checkin_em": null,
                                            "posto": null,
                                            "atraso_minutos": null,
                                            "motivo_cancelamento": null,
                                            "remarcada_de": null,
                                            "remarcacoes": [],
                                            "politica": "Cancelamentos com menos de 24 h de antecedência perdem o sinal.",
                                            "historico": [
                                                {
                                                    "acao": "confirmacao",
                                                    "descricao": "Confirmada pela equipa",
                                                    "autor": "Ana Ribeiro",
                                                    "criado_em": "2026-10-28T10:02:11+00:00"
                                                },
                                                {
                                                    "acao": "criada",
                                                    "descricao": "Marcada (Equipa)",
                                                    "autor": "Ana Ribeiro",
                                                    "criado_em": "2026-10-28T09:12:44+00:00"
                                                }
                                            ],
                                            "acoes": [
                                                "remarcar",
                                                "cancelar",
                                                "lembrete"
                                            ]
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Não é possível neste estado."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/marcacoes/{id}/lembrete": {
            "post": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6LembreteMarcacao",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da marcação"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "summary": "Enviar o lembrete agora",
                "description": "Envia ao paciente (ou lead) o lembrete com a data, a hora e a ligação pública para confirmar, cancelar ou remarcar, pelos canais de Definições › Agenda › canais do lembrete (email, SMS, WhatsApp), na língua do paciente. Finalidade «serviço» e sem pormenores clínicos (nem o tipo de ato); nas teleconsultas acrescenta a indicação de videoconsulta. Efeitos: lembrete_enviado_em e linha no histórico. 422 «lembrete_falhou» quando nenhum canal entregou, não há contacto ou a marcação não está em pedido/marcada/confirmada.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ok": {
                                                    "type": "boolean"
                                                },
                                                "canais": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string",
                                                        "enum": [
                                                            "email",
                                                            "sms",
                                                            "whatsapp"
                                                        ]
                                                    },
                                                    "description": "Canais que entregaram."
                                                },
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ok": true,
                                        "canais": [
                                            "email",
                                            "sms"
                                        ],
                                        "mensagem": "Lembrete enviado."
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Regra de negócio (lembrete_falhou)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "lembrete_falhou": {
                                        "summary": "lembrete_falhou",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "lembrete_falhou",
                                                "mensagem": "Não foi possível enviar o lembrete (sem contacto ou canal desligado)."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/marcacoes/{id}/ligacao": {
            "post": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6LigacaoMarcacao",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da marcação"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "summary": "Ligação pública da marcação",
                "description": "Endereço /marcacao/<token> para o paciente confirmar, cancelar, remarcar, avisar de atraso, fazer o check-in ou entrar na sala de espera da teleconsulta, sem sessão. Válida pelo menos 7 dias (até 2 dias depois do fim da marcação); pode ser reenviada sem invalidar a anterior. Com \"renovar\": true muda a validade e invalida todas as ligações antigas. Só o resumo criptográfico do token fica guardado.",
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "renovar": {
                                        "type": "boolean",
                                        "description": "Invalidar as ligações anteriores."
                                    }
                                }
                            },
                            "example": {
                                "renovar": false
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "url": {
                                                    "type": "string",
                                                    "format": "uri"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "url": "https://clinica.pt/marcacao/q8vN2xY7cTzK4pLmW0sRb3HdFgJ5aE1uQyVnXo6iC9k"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/marcacoes/{id}/mover": {
            "post": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6MoverMarcacao",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da marcação"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "summary": "Mover ou redimensionar (calendário)",
                "description": "Só em pedido, marcada ou confirmada (409 «estado_invalido»). Sem «fim» mantém a duração. Pode mudar de profissional ou sala (arrastar entre colunas). Conflitos como na criação (409 «conflito» / «conflito_aviso»; reenvie com \"forcar\": true). Uma mudança de hora numa marcação confirmada devolve-a a «marcada» (o paciente volta a confirmar) e repõe o lembrete; com Definições › Agenda › avisar alterações, o paciente recebe um email (finalidade serviço, sem pormenores clínicos) com a nova hora e a ligação pública. Efeitos: histórico e auditoria. Um bloco cirúrgico muda-se pelo mapa de cirurgias: o pedido é encaminhado para a reserva da cirurgia (exige «bloco.marcar» editar) e a resposta é a da reserva. As horas da resposta vêm na hora local da clínica, sem fuso.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "inicio": {
                                        "type": "string",
                                        "format": "date-time",
                                        "description": "Novo início."
                                    },
                                    "fim": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date-time",
                                        "description": "Novo fim (redimensionar)."
                                    },
                                    "profissional_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "description": "Novo profissional (coluna de destino)."
                                    },
                                    "sala_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "description": "Nova sala (coluna de destino)."
                                    },
                                    "forcar": {
                                        "type": "boolean",
                                        "description": "Aceitar os avisos (conflito_aviso: feriado, fora do horário, sem horário, data passada). Nunca anula conflitos bloqueantes."
                                    }
                                },
                                "required": [
                                    "inicio"
                                ]
                            },
                            "example": {
                                "inicio": "2026-11-03T11:00:00+00:00",
                                "profissional_id": 7,
                                "forcar": false
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6ResultadoMover"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 8840,
                                        "inicio": "2026-11-03T11:00:00",
                                        "fim": "2026-11-03T11:45:00",
                                        "avisos": []
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (conflito, conflito_aviso, estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "conflito": {
                                        "summary": "conflito",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "conflito",
                                                "mensagem": "Há conflitos na agenda.",
                                                "campos": {
                                                    "profissional_id": "Inês Valente já tem uma marcação das 10:00–10:45.",
                                                    "sala_id": "Gabinete 2 está ocupada (a partir das 10:00)."
                                                }
                                            }
                                        }
                                    },
                                    "conflito_aviso": {
                                        "summary": "conflito_aviso",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "conflito_aviso",
                                                "mensagem": "Há avisos na agenda. Confirme para continuar.",
                                                "campos": {
                                                    "inicio": "É feriado: Implantação da República."
                                                }
                                            }
                                        }
                                    },
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Esta marcação já não pode ser mudada."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/marcacoes/{id}/remarcar": {
            "post": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6RemarcarMarcacao",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da marcação"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "summary": "Remarcar (nova marcação ligada à anterior)",
                "description": "Cria uma marcação nova com o mesmo paciente/lead, tipo, duração, sala, recursos, participantes e notas (profissional opcionalmente outro), ligada à anterior por «remarcada_de»; a anterior passa a «remarcada». Conflitos como na criação (409; reenvie com \"forcar\": true para aceitar avisos). Efeitos: histórico nas duas, teleconsulta ainda por iniciar passada para a nova marcação, email ao paciente com a nova hora e a ligação pública (Definições › Agenda › avisar alterações), vaga oferecida à lista de espera e webhook marcacao.criada da nova marcação.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "inicio": {
                                        "type": "string",
                                        "format": "date-time",
                                        "description": "Novo início (a duração mantém-se)."
                                    },
                                    "profissional_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "description": "Outro profissional (opcional)."
                                    },
                                    "forcar": {
                                        "type": "boolean",
                                        "description": "Aceitar os avisos (conflito_aviso: feriado, fora do horário, sem horário, data passada). Nunca anula conflitos bloqueantes."
                                    }
                                },
                                "required": [
                                    "inicio"
                                ]
                            },
                            "example": {
                                "inicio": "2026-11-05T15:00:00+00:00"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer",
                                                    "description": "Nova marcação."
                                                },
                                                "anterior": {
                                                    "type": "integer",
                                                    "description": "Marcação remarcada."
                                                },
                                                "avisos": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/M6Conflito"
                                                    }
                                                },
                                                "mensagem": {
                                                    "type": "string"
                                                },
                                                "marcacao": {
                                                    "$ref": "#/components/schemas/M6Marcacao"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 8861,
                                        "anterior": 8840,
                                        "avisos": [],
                                        "mensagem": "Marcação remarcada.",
                                        "marcacao": {
                                            "id": 8861,
                                            "estado": "marcada",
                                            "estado_rotulo": "Por confirmar",
                                            "estado_tom": "aviso",
                                            "origem": "equipa",
                                            "origem_rotulo": "Equipa",
                                            "inicio": "2026-11-05T15:00:00+00:00",
                                            "fim": "2026-11-05T15:45:00+00:00",
                                            "duracao_min": 45,
                                            "paciente_id": 1204,
                                            "paciente_nome": "Rui Almeida",
                                            "lead_id": null,
                                            "lead_nome": null,
                                            "episodio_id": 77,
                                            "cirurgia_id": null,
                                            "tipo_id": 3,
                                            "tipo_nome": "Consulta de avaliação",
                                            "tipo_cor": "#2F6F62",
                                            "teleconsulta": null,
                                            "profissional_id": 7,
                                            "profissional_nome": "Inês Valente",
                                            "profissional_cor": "#7A4E9C",
                                            "sala_id": 12,
                                            "sala_nome": "Gabinete 2",
                                            "recursos": [
                                                {
                                                    "id": 21,
                                                    "nome": "Tricoscópio digital",
                                                    "tipo": "equipamento"
                                                }
                                            ],
                                            "participantes": [
                                                {
                                                    "utilizador_id": 15,
                                                    "nome": "Marta Sousa",
                                                    "papel": "assistente",
                                                    "cor": "#C0743A"
                                                }
                                            ],
                                            "notas": "Pede para ser contactado depois das 18:00.",
                                            "confirmada_em": null,
                                            "confirmacao_canal": null,
                                            "lembrete_enviado_em": null,
                                            "checkin_em": null,
                                            "posto": null,
                                            "atraso_minutos": null,
                                            "motivo_cancelamento": null,
                                            "remarcada_de": 8840,
                                            "remarcacoes": [
                                                {
                                                    "id": 8840,
                                                    "inicio": "2026-11-03T10:00:00+00:00"
                                                }
                                            ],
                                            "politica": "Cancelamentos com menos de 24 h de antecedência perdem o sinal.",
                                            "historico": [
                                                {
                                                    "acao": "criada",
                                                    "descricao": "Marcada (Equipa)",
                                                    "autor": "Ana Ribeiro",
                                                    "criado_em": "2026-10-28T09:12:44+00:00"
                                                }
                                            ],
                                            "acoes": [
                                                "confirmar",
                                                "remarcar",
                                                "cancelar",
                                                "lembrete"
                                            ]
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (conflito, conflito_aviso, estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "conflito": {
                                        "summary": "conflito",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "conflito",
                                                "mensagem": "Há conflitos na agenda.",
                                                "campos": {
                                                    "profissional_id": "Inês Valente já tem uma marcação das 10:00–10:45.",
                                                    "sala_id": "Gabinete 2 está ocupada (a partir das 10:00)."
                                                }
                                            }
                                        }
                                    },
                                    "conflito_aviso": {
                                        "summary": "conflito_aviso",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "conflito_aviso",
                                                "mensagem": "Há avisos na agenda. Confirme para continuar.",
                                                "campos": {
                                                    "inicio": "É feriado: Implantação da República."
                                                }
                                            }
                                        }
                                    },
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Esta marcação já não pode ser mudada."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/ocupacao": {
            "get": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6AgendaOcupacao",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "ver",
                "summary": "Ocupação por profissional ou sala",
                "description": "Horas disponíveis (pelos horários; salas sem horário contam as horas do calendário nos dias úteis), horas ocupadas pelas marcações que ocupam agenda, percentagem e número de marcações. A receita estimada (preço base dos procedimentos dos tipos) só sai para quem tem «financeiro.valores» com âmbito «todos». Por omissão a semana corrente.",
                "parameters": [
                    {
                        "name": "inicio",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Início (por omissão segunda-feira desta semana)."
                    },
                    {
                        "name": "fim",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Fim (por omissão início + 7 dias)."
                    },
                    {
                        "name": "colunas",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "profissional",
                                "sala",
                                "equipamento"
                            ],
                            "default": "profissional"
                        },
                        "description": "Agrupar por profissional, sala ou equipamento (no equipamento: capacidade e horas em manutenção)."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/M6Ocupacao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 7,
                                            "nome": "Inês Valente",
                                            "cor": "#7A4E9C",
                                            "horas_disponiveis": 36,
                                            "horas_ocupadas": 27.5,
                                            "percentagem": 76,
                                            "marcacoes": 31,
                                            "receita": 4650
                                        },
                                        {
                                            "id": 9,
                                            "nome": "Ricardo Lemos",
                                            "cor": "#2F6F62",
                                            "horas_disponiveis": 20,
                                            "horas_ocupadas": 8,
                                            "percentagem": 40,
                                            "marcacoes": 9,
                                            "receita": 1350
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/quiosque/codigo": {
            "post": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6QuiosqueCodigo",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "summary": "Check-in no modo quiosque (código ou QR)",
                "description": "Código de entrada de 6 caracteres do dia (HMAC de clínica, marcação e dia; nada guardado) ou o conteúdo do código QR (a ligação pessoal). Só marcações presenciais de hoje, na janela das Definições. Resposta mínima: primeiro nome e inicial, hora, sala, profissional. Sem correspondência: 404 com mensagem genérica. Efeitos: check-in (posto «admissão»), histórico, notificação ao profissional, auditoria. Limite: 60 por 10 minutos.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "codigo": {
                                        "type": "string",
                                        "maxLength": 300
                                    }
                                },
                                "required": [
                                    "codigo"
                                ]
                            },
                            "example": {
                                "codigo": "K7M 3QX"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ok": {
                                                    "type": "boolean"
                                                },
                                                "ja_tinha": {
                                                    "type": "boolean"
                                                },
                                                "nome": {
                                                    "type": "string"
                                                },
                                                "hora": {
                                                    "type": "string"
                                                },
                                                "local": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "profissional": {
                                                    "type": "string"
                                                },
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ok": true,
                                        "ja_tinha": false,
                                        "nome": "Rui A.",
                                        "hora": "10:30",
                                        "local": "Gabinete 2",
                                        "profissional": "Inês Valente",
                                        "mensagem": "Bem-vindo(a), Rui A. A sua chegada foi registada; vai ser chamado(a) em breve."
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/quiosque/telefone": {
            "post": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6QuiosqueTelefone",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "summary": "Check-in no modo quiosque (telemóvel e data de nascimento)",
                "description": "Comparação pelos últimos 9 algarismos do telefone e pela data de nascimento; a marcação de hoje mais próxima ainda sem check-in. Desligável nas Definições (422 «nao_permitido»). Limite: 30 por 10 minutos.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "telefone": {
                                        "type": "string",
                                        "maxLength": 30
                                    },
                                    "data_nascimento": {
                                        "type": "string",
                                        "format": "date"
                                    }
                                },
                                "required": [
                                    "telefone",
                                    "data_nascimento"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/quiosques": {
            "get": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6QuiosquesListar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "summary": "Quiosques de admissão da receção",
                "description": "Tablets com o endereço /quiosque/<código>: nome, prefixo, check-ins, último uso, ativo, bloqueado.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 2,
                                            "nome": "Receção — entrada",
                                            "prefixo": "7d2c3b8a",
                                            "ativo": true,
                                            "checkins": 133,
                                            "ultimo_uso_em": "2026-11-03T09:12:00+00:00",
                                            "bloqueado": false
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            },
            "post": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6QuiosquesCriar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "summary": "Criar um quiosque",
                "description": "Código de 256 bits; só o resumo criptográfico fica guardado. O endereço é devolvido uma única vez.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "nome": {
                                        "type": "string",
                                        "maxLength": 80
                                    }
                                },
                                "required": [
                                    "nome"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "url": {
                                                    "type": "string",
                                                    "format": "uri"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 3,
                                        "url": "https://clinica.pt/quiosque/7d2c3b8a…"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/quiosques/{id}/revogar": {
            "post": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6QuiosquesRevogar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "summary": "Revogar um quiosque",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/sala-espera": {
            "get": {
                "tags": [
                    "Fluxo do dia"
                ],
                "operationId": "m6SalaEspera",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "ver",
                "summary": "Ecrã da sala de espera",
                "description": "Para a televisão da sala de espera (ecrã «sala_espera»): quem está a ser atendido (até 6) e quem é o seguinte (até 8) hoje, só com o primeiro nome e a inicial do apelido, o gabinete e a hora. Exclui os blocos cirúrgicos.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6SalaEspera"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "atendidos": [
                                            {
                                                "nome": "Rui A.",
                                                "sala": "Gabinete 2",
                                                "hora": "10:00"
                                            }
                                        ],
                                        "seguintes": [
                                            {
                                                "nome": "Carla N.",
                                                "sala": "Gabinete 1",
                                                "hora": "10:30"
                                            },
                                            {
                                                "nome": "Tiago M.",
                                                "sala": "Gabinete 2",
                                                "hora": "11:00"
                                            }
                                        ],
                                        "hora": "10:07"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/agenda/sincronizar": {
            "get": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6SincronizacaoEstado",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "ver",
                "summary": "Estado da ligação de calendário pessoal",
                "description": "Se a pessoa tem uma ligação de subscrição ativa (formato iCalendar, só leitura), os primeiros 8 caracteres para a reconhecer e o último uso. A ligação completa nunca é devolvida aqui.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Sincronizacao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ativa": true,
                                        "prefixo": "9c1f04ab",
                                        "ultimo_uso_em": "2026-10-28T06:00:12+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            },
            "post": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6SincronizacaoGerar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "ver",
                "summary": "Gerar a ligação de calendário pessoal",
                "description": "Gera uma ligação nova (revoga a anterior) para subscrever as próprias marcações numa aplicação de calendário externa. A ligação é mostrada uma única vez. Proteção de dados: o calendário externo nunca recebe o nome do paciente nem pormenores clínicos — só o tipo de ato, a sala e a ligação para abrir a marcação no AnagenSys (que pede sessão). Token de 256 bits; só o resumo criptográfico fica guardado. Limite: 10 pedidos por 10 minutos. Efeitos: auditoria.",
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "allOf": [
                                                {
                                                    "$ref": "#/components/schemas/M6Sincronizacao"
                                                },
                                                {
                                                    "type": "object",
                                                    "properties": {
                                                        "url": {
                                                            "type": "string",
                                                            "format": "uri",
                                                            "description": "Mostrar uma única vez."
                                                        }
                                                    }
                                                }
                                            ]
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "url": "https://clinica.pt/agenda/ics/9c1f04ab5e7d2c3b8a6f1e0d4c9b2a7f3e5d8c1b6a4f2e9d0c7b5a3f1e8d6c4b.ics",
                                        "ativa": true,
                                        "prefixo": "9c1f04ab",
                                        "ultimo_uso_em": null
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            },
            "delete": {
                "tags": [
                    "Agenda"
                ],
                "operationId": "m6SincronizacaoRevogar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "ver",
                "summary": "Revogar a ligação de calendário pessoal",
                "description": "A subscrição deixa de receber dados de imediato. Efeitos: auditoria «revogar».",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Sincronizacao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ativa": false,
                                        "prefixo": null,
                                        "ultimo_uso_em": null
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/ajuda": {
            "get": {
                "tags": [
                    "Ajuda"
                ],
                "operationId": "ajuda",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "paciente": []
                    }
                ],
                "summary": "Artigos de ajuda (lista, pesquisa ou contextual)",
                "description": "Sem parâmetros: artigos visíveis (equipa: pelas permissões; paciente: só os do portal). ?q= pesquisa. ?ecra=<chave de ecrã ou recurso> devolve o artigo desse ecrã (404 se não houver).",
                "parameters": [
                    {
                        "name": "q",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "maxLength": 80
                        }
                    },
                    {
                        "name": "ecra",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "pattern": "^[a-z0-9_]{2,60}$"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "oneOf": [
                                                {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "chave": {
                                                                "type": "string"
                                                            },
                                                            "titulo": {
                                                                "type": "string"
                                                            },
                                                            "resumo": {
                                                                "type": "string"
                                                            },
                                                            "capitulo": {
                                                                "type": "string"
                                                            },
                                                            "tipo": {
                                                                "type": "string",
                                                                "enum": [
                                                                    "artigo",
                                                                    "primeiros_passos",
                                                                    "faq",
                                                                    "glossario",
                                                                    "atalhos"
                                                                ]
                                                            },
                                                            "modulo": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "perfis": {
                                                                "type": "array",
                                                                "items": {
                                                                    "type": "string"
                                                                }
                                                            },
                                                            "palavras": {
                                                                "type": "array",
                                                                "items": {
                                                                    "type": "string"
                                                                }
                                                            },
                                                            "ordem": {
                                                                "type": "integer"
                                                            }
                                                        }
                                                    }
                                                },
                                                {
                                                    "type": "object",
                                                    "properties": {
                                                        "chave": {
                                                            "type": "string"
                                                        },
                                                        "titulo": {
                                                            "type": "string"
                                                        },
                                                        "resumo": {
                                                            "type": "string"
                                                        },
                                                        "capitulo": {
                                                            "type": "string"
                                                        },
                                                        "tipo": {
                                                            "type": "string",
                                                            "enum": [
                                                                "artigo",
                                                                "primeiros_passos",
                                                                "faq",
                                                                "glossario",
                                                                "atalhos"
                                                            ]
                                                        },
                                                        "modulo": {
                                                            "type": [
                                                                "string",
                                                                "null"
                                                            ]
                                                        },
                                                        "perfis": {
                                                            "type": "array",
                                                            "items": {
                                                                "type": "string"
                                                            }
                                                        },
                                                        "palavras": {
                                                            "type": "array",
                                                            "items": {
                                                                "type": "string"
                                                            }
                                                        },
                                                        "ordem": {
                                                            "type": "integer"
                                                        }
                                                    }
                                                }
                                            ]
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/ajuda/manual": {
            "get": {
                "tags": [
                    "Ajuda"
                ],
                "operationId": "manual",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "paciente": []
                    }
                ],
                "summary": "Manual do Sistema (capítulos e secções numeradas)",
                "parameters": [
                    {
                        "name": "conteudo",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "enum": [
                                0,
                                1
                            ]
                        },
                        "description": "1 = inclui o HTML de cada secção"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "numero": {
                                                        "type": "integer"
                                                    },
                                                    "chave": {
                                                        "type": "string"
                                                    },
                                                    "titulo": {
                                                        "type": "string"
                                                    },
                                                    "icone": {
                                                        "type": "string"
                                                    },
                                                    "seccoes": {
                                                        "type": "array",
                                                        "items": {
                                                            "type": "object"
                                                        }
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    }
                }
            }
        },
        "/ajuda/{chave}": {
            "get": {
                "tags": [
                    "Ajuda"
                ],
                "operationId": "ajudaArtigo",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "paciente": []
                    }
                ],
                "summary": "Um artigo (HTML sanitizado e relacionados)",
                "parameters": [
                    {
                        "name": "chave",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "chave": {
                                                    "type": "string"
                                                },
                                                "titulo": {
                                                    "type": "string"
                                                },
                                                "resumo": {
                                                    "type": "string"
                                                },
                                                "capitulo": {
                                                    "type": "string"
                                                },
                                                "tipo": {
                                                    "type": "string",
                                                    "enum": [
                                                        "artigo",
                                                        "primeiros_passos",
                                                        "faq",
                                                        "glossario",
                                                        "atalhos"
                                                    ]
                                                },
                                                "modulo": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "perfis": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "palavras": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "ordem": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/ambiente": {
            "get": {
                "tags": [
                    "Ambiente"
                ],
                "operationId": "ambienteDeExecucao",
                "security": [],
                "summary": "Ambiente do servidor",
                "description": "Público (60 pedidos por minuto por endereço). Nunca inclui endereços nem a lista de destinos autorizados.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/AmbienteExecucao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ambiente": "testes",
                                        "producao": false,
                                        "titulo": "Ambiente de testes",
                                        "texto": "Os dados são de teste e nada sai para o exterior…",
                                        "tom": "aviso",
                                        "canais_permitidos": [],
                                        "destinos_restritos": false,
                                        "dados": {
                                            "tipo": "sinteticos",
                                            "rotulo": "dados sintéticos",
                                            "em": "2026-10-29 15:02:11",
                                            "aviso": null
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/aparelhos": {
            "get": {
                "tags": [
                    "Avisos no telemóvel"
                ],
                "operationId": "aparelhosListar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "paciente": []
                    }
                ],
                "summary": "Os meus aparelhos",
                "description": "Aparelhos da pessoa com a sessão viva (os de sessões terminadas são apagados). «este» = o da sessão do pedido. Nunca devolve tokens.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 14,
                                            "plataforma": "ios",
                                            "nome": "iPhone de Inês (iOS 19.1)",
                                            "lingua": "pt-PT",
                                            "versao_app": "1.0.0+1",
                                            "ultima_atividade_em": "2026-10-29T09:12:00+00:00",
                                            "ultimo_envio_em": "2026-10-29T09:30:41+00:00",
                                            "envios": 37,
                                            "falhas": 0,
                                            "este": true,
                                            "criado_em": "2026-10-29T08:01:00+00:00"
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            },
            "post": {
                "tags": [
                    "Avisos no telemóvel"
                ],
                "operationId": "aparelhosRegistar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "paciente": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Registar este aparelho",
                "description": "Regista ou atualiza o aparelho da sessão atual da app. O token fica cifrado; o mesmo aparelho noutra conta ou clínica é retirado de lá. Um aparelho por sessão; máximo 10 por pessoa. Limite: 30 pedidos/10 min.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "token",
                                    "fornecedor",
                                    "plataforma"
                                ],
                                "properties": {
                                    "token": {
                                        "type": "string",
                                        "minLength": 20,
                                        "maxLength": 4096
                                    },
                                    "fornecedor": {
                                        "type": "string",
                                        "enum": [
                                            "fcm",
                                            "apns"
                                        ]
                                    },
                                    "plataforma": {
                                        "type": "string",
                                        "enum": [
                                            "android",
                                            "ios",
                                            "macos"
                                        ]
                                    },
                                    "ambiente": {
                                        "type": "string",
                                        "enum": [
                                            "producao",
                                            "desenvolvimento"
                                        ]
                                    },
                                    "lingua": {
                                        "type": "string",
                                        "enum": [
                                            "pt-PT",
                                            "pt-BR",
                                            "en",
                                            "es",
                                            "fr",
                                            "de"
                                        ]
                                    },
                                    "nome": {
                                        "type": "string",
                                        "maxLength": 120
                                    },
                                    "versao_app": {
                                        "type": "string",
                                        "maxLength": 30
                                    }
                                }
                            },
                            "example": {
                                "token": "f3k9…:APA91b…",
                                "fornecedor": "fcm",
                                "plataforma": "android",
                                "ambiente": "producao",
                                "lingua": "pt-PT",
                                "nome": "Samsung SM-S921B",
                                "versao_app": "1.0.0+1"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 14,
                                        "plataforma": "ios",
                                        "nome": "iPhone de Inês (iOS 19.1)",
                                        "lingua": "pt-PT",
                                        "versao_app": "1.0.0+1",
                                        "ultima_atividade_em": "2026-10-29T09:12:00+00:00",
                                        "ultimo_envio_em": "2026-10-29T09:30:41+00:00",
                                        "envios": 37,
                                        "falhas": 0,
                                        "este": true,
                                        "criado_em": "2026-10-29T08:01:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/aparelhos/configuracao": {
            "get": {
                "tags": [
                    "Avisos no telemóvel"
                ],
                "operationId": "aparelhosConfiguracao",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "paciente": []
                    }
                ],
                "summary": "Configuração pública dos avisos",
                "description": "Se os avisos estão ligados e, por plataforma (android, ios, macos, windows), se está pronta, por onde chega (fcm = projeto de avisos; apns = diretamente pela Apple; local = avisos locais com a app aberta) e os identificadores PÚBLICOS do projeto (app_id, api_key, remetente, projeto) para a app iniciar o serviço. Nunca devolve credenciais. Traz também as categorias com a preferência da pessoa.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ativo": {
                                                    "type": "boolean"
                                                },
                                                "plataformas": {
                                                    "type": "object",
                                                    "additionalProperties": {
                                                        "type": "object",
                                                        "properties": {
                                                            "ativo": {
                                                                "type": "boolean"
                                                            },
                                                            "fornecedor": {
                                                                "type": "string",
                                                                "enum": [
                                                                    "fcm",
                                                                    "apns",
                                                                    "local"
                                                                ]
                                                            },
                                                            "projeto": {
                                                                "type": [
                                                                    "object",
                                                                    "null"
                                                                ],
                                                                "properties": {
                                                                    "app_id": {
                                                                        "type": "string"
                                                                    },
                                                                    "api_key": {
                                                                        "type": "string"
                                                                    },
                                                                    "remetente": {
                                                                        "type": "string"
                                                                    },
                                                                    "projeto": {
                                                                        "type": "string"
                                                                    }
                                                                }
                                                            },
                                                            "pacote": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "categorias": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "chave": {
                                                                "type": "string",
                                                                "enum": [
                                                                    "mensagens",
                                                                    "agenda",
                                                                    "tarefas",
                                                                    "documentos",
                                                                    "pagamentos",
                                                                    "alertas",
                                                                    "geral"
                                                                ]
                                                            },
                                                            "rotulo": {
                                                                "type": "string"
                                                            },
                                                            "descricao": {
                                                                "type": "string"
                                                            },
                                                            "push": {
                                                                "type": "boolean"
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ativo": true,
                                        "plataformas": {
                                            "android": {
                                                "ativo": true,
                                                "fornecedor": "fcm",
                                                "projeto": {
                                                    "app_id": "1:123456789012:android:abc123",
                                                    "api_key": "AIza…",
                                                    "remetente": "123456789012",
                                                    "projeto": "anagensys-avisos"
                                                }
                                            },
                                            "ios": {
                                                "ativo": true,
                                                "fornecedor": "apns",
                                                "projeto": {
                                                    "app_id": "1:123456789012:ios:def456",
                                                    "api_key": "AIza…",
                                                    "remetente": "123456789012",
                                                    "projeto": "anagensys-avisos"
                                                },
                                                "pacote": "pt.anagen.anagensys"
                                            },
                                            "windows": {
                                                "ativo": true,
                                                "fornecedor": "local",
                                                "projeto": null
                                            }
                                        },
                                        "categorias": [
                                            {
                                                "chave": "mensagens",
                                                "rotulo": "Mensagens",
                                                "descricao": "Mensagens de pacientes e da equipa, menções e comunicados.",
                                                "push": true
                                            },
                                            {
                                                "chave": "agenda",
                                                "rotulo": "Agenda e marcações",
                                                "descricao": "Marcações, teleconsultas, bloco operatório e reuniões.",
                                                "push": false
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/aparelhos/plataforma": {
            "get": {
                "tags": [
                    "Avisos no telemóvel"
                ],
                "operationId": "aparelhosPlataforma",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Estado do serviço de avisos (superadministradores)",
                "description": "Configuração (sem segredos), aparelhos por plataforma e avisos das últimas 24 h por estado, em todas as clínicas — só contagens. 403 para quem não é superadministrador.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "configuracao": {
                                                    "type": "object"
                                                },
                                                "aparelhos": {
                                                    "type": "object"
                                                },
                                                "ultimas_24h": {
                                                    "type": "object"
                                                },
                                                "ultima_execucao": {
                                                    "type": [
                                                        "object",
                                                        "null"
                                                    ],
                                                    "properties": {
                                                        "em": {
                                                            "type": [
                                                                "string",
                                                                "null"
                                                            ],
                                                            "format": "date-time"
                                                        },
                                                        "estado": {
                                                            "type": "string"
                                                        }
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/aparelhos/{id}": {
            "delete": {
                "tags": [
                    "Avisos no telemóvel"
                ],
                "operationId": "aparelhosRemover",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "paciente": []
                    }
                ],
                "summary": "Deixar de receber neste aparelho",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/aparelhos/{id}/testar": {
            "post": {
                "tags": [
                    "Avisos no telemóvel"
                ],
                "operationId": "aparelhosTestar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "paciente": []
                    }
                ],
                "summary": "Enviar aviso de teste",
                "description": "Envia ao aparelho (da própria pessoa) um aviso de teste. ok:false quando o serviço recusa (token inválido → o aparelho é apagado). 409 com os avisos desligados ou num ambiente de testes. Limite: 5/10 min.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ok": {
                                                    "type": "boolean"
                                                },
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ok": true,
                                        "mensagem": "Aviso de teste enviado. Deve chegar ao aparelho dentro de momentos."
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/atividade": {
            "get": {
                "tags": [
                    "Atividade"
                ],
                "operationId": "atividade",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "ver",
                "summary": "Registo de atividade (lista)",
                "description": "Mais recentes primeiro; período por omissão: últimos 7 dias (máx. 366). Filtros em f[…] (ou no topo, exceto pagina). depois_id devolve só as linhas novas (até 100) para a atualização ao vivo. meta: {pagina, por_pagina, total, ultimo_id, filtros, periodo, clinica, exportar}.",
                "parameters": [
                    {
                        "name": "f[ator]",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Pessoa da equipa"
                    },
                    {
                        "name": "f[ator_tipo]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "utilizador",
                                "paciente",
                                "integracao",
                                "sistema",
                                "anonimo"
                            ]
                        }
                    },
                    {
                        "name": "f[acao]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "entrou",
                                "saiu",
                                "falhou_entrada",
                                "abriu",
                                "viu",
                                "criou",
                                "alterou",
                                "eliminou",
                                "exportou",
                                "imprimiu",
                                "descarregou",
                                "enviou",
                                "assinou",
                                "aprovou",
                                "revogou",
                                "pesquisou",
                                "acesso_emergencia"
                            ]
                        }
                    },
                    {
                        "name": "f[familia]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "consultas",
                                "alteracoes",
                                "entradas",
                                "saidas"
                            ]
                        }
                    },
                    {
                        "name": "f[paciente]",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "f[alvo_tipo]",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[alvo_id]",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "f[pagina]",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Rótulo da página ou ecrã (igual)"
                    },
                    {
                        "name": "f[origem]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "web",
                                "app",
                                "api",
                                "integracao",
                                "agendador"
                            ]
                        }
                    },
                    {
                        "name": "f[de]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "f[ate]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "f[dia]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "f[hora]",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 23
                        }
                    },
                    {
                        "name": "f[q]",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Pessoa, página, detalhe ou endereço"
                    },
                    {
                        "name": "f[fora_horas]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "1"
                            ]
                        }
                    },
                    {
                        "name": "clinica",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Só para a gestão da plataforma: id de outra clínica ou «todas». Para os restantes é sempre a clínica do contexto."
                    },
                    {
                        "name": "depois_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "integer"
                                                    },
                                                    "quando": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ],
                                                        "format": "date-time"
                                                    },
                                                    "clinica_id": {
                                                        "type": "integer"
                                                    },
                                                    "ator": {
                                                        "type": "object",
                                                        "properties": {
                                                            "tipo": {
                                                                "type": "string"
                                                            },
                                                            "id": {
                                                                "type": [
                                                                    "integer",
                                                                    "null"
                                                                ]
                                                            },
                                                            "nome": {
                                                                "type": "string"
                                                            },
                                                            "perfil": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "perfil_rotulo": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "ligacao": {
                                                                "type": [
                                                                    "object",
                                                                    "null"
                                                                ],
                                                                "properties": {
                                                                    "tipo": {
                                                                        "type": "string"
                                                                    },
                                                                    "id": {
                                                                        "type": "integer"
                                                                    },
                                                                    "pode_abrir": {
                                                                        "type": "boolean"
                                                                    },
                                                                    "web": {
                                                                        "type": [
                                                                            "string",
                                                                            "null"
                                                                        ]
                                                                    },
                                                                    "app": {
                                                                        "type": [
                                                                            "string",
                                                                            "null"
                                                                        ]
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    },
                                                    "acao": {
                                                        "type": "string",
                                                        "enum": [
                                                            "entrou",
                                                            "saiu",
                                                            "falhou_entrada",
                                                            "abriu",
                                                            "viu",
                                                            "criou",
                                                            "alterou",
                                                            "eliminou",
                                                            "exportou",
                                                            "imprimiu",
                                                            "descarregou",
                                                            "enviou",
                                                            "assinou",
                                                            "aprovou",
                                                            "revogou",
                                                            "pesquisou",
                                                            "acesso_emergencia"
                                                        ]
                                                    },
                                                    "acao_rotulo": {
                                                        "type": "string"
                                                    },
                                                    "tom": {
                                                        "type": "string"
                                                    },
                                                    "pagina": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "pagina_rotulo": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "modulo": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "ecra": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "alvo": {
                                                        "type": [
                                                            "object",
                                                            "null"
                                                        ],
                                                        "properties": {
                                                            "tipo": {
                                                                "type": "string"
                                                            },
                                                            "id": {
                                                                "type": "integer"
                                                            },
                                                            "pode_abrir": {
                                                                "type": "boolean"
                                                            },
                                                            "web": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "app": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            }
                                                        }
                                                    },
                                                    "paciente": {
                                                        "type": [
                                                            "object",
                                                            "null"
                                                        ],
                                                        "properties": {
                                                            "id": {
                                                                "type": "integer"
                                                            },
                                                            "nome": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "ligacao": {
                                                                "type": [
                                                                    "object",
                                                                    "null"
                                                                ],
                                                                "properties": {
                                                                    "tipo": {
                                                                        "type": "string"
                                                                    },
                                                                    "id": {
                                                                        "type": "integer"
                                                                    },
                                                                    "pode_abrir": {
                                                                        "type": "boolean"
                                                                    },
                                                                    "web": {
                                                                        "type": [
                                                                            "string",
                                                                            "null"
                                                                        ]
                                                                    },
                                                                    "app": {
                                                                        "type": [
                                                                            "string",
                                                                            "null"
                                                                        ]
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    },
                                                    "lead_id": {
                                                        "type": [
                                                            "integer",
                                                            "null"
                                                        ]
                                                    },
                                                    "campos": {
                                                        "type": "array",
                                                        "items": {
                                                            "type": "string"
                                                        }
                                                    },
                                                    "detalhe": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "origem": {
                                                        "type": "string",
                                                        "enum": [
                                                            "web",
                                                            "app",
                                                            "api",
                                                            "integracao",
                                                            "agendador"
                                                        ]
                                                    },
                                                    "origem_rotulo": {
                                                        "type": "string"
                                                    },
                                                    "plataforma": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "dispositivo": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "ip": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "metodo": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "http": {
                                                        "type": [
                                                            "integer",
                                                            "null"
                                                        ]
                                                    },
                                                    "duracao_ms": {
                                                        "type": [
                                                            "integer",
                                                            "null"
                                                        ]
                                                    },
                                                    "pedido_id": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "pagina": {
                                                    "type": "integer"
                                                },
                                                "por_pagina": {
                                                    "type": "integer"
                                                },
                                                "total": {
                                                    "type": "integer"
                                                },
                                                "ultimo_id": {
                                                    "type": "integer"
                                                },
                                                "exportar": {
                                                    "type": "boolean"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 48211,
                                            "quando": "2026-10-28T10:14:03+00:00",
                                            "clinica_id": 1,
                                            "ator": {
                                                "tipo": "utilizador",
                                                "id": 7,
                                                "nome": "Inês Valente",
                                                "perfil": "medico",
                                                "perfil_rotulo": "Médico",
                                                "ligacao": {
                                                    "tipo": "utilizadores",
                                                    "id": 7,
                                                    "pode_abrir": true,
                                                    "web": "equipa/r/utilizadores/7",
                                                    "app": "/r/utilizadores/7"
                                                }
                                            },
                                            "acao": "alterou",
                                            "acao_rotulo": "Alterou",
                                            "tom": "ouro",
                                            "pagina": "api/v1/r/propostas/31",
                                            "pagina_rotulo": "Propostas",
                                            "modulo": "comercial.propostas",
                                            "ecra": null,
                                            "alvo": {
                                                "tipo": "propostas",
                                                "id": 31,
                                                "pode_abrir": true,
                                                "web": "equipa/r/propostas/31",
                                                "app": "/r/propostas/31"
                                            },
                                            "paciente": {
                                                "id": 12,
                                                "nome": "Rita Matos",
                                                "ligacao": {
                                                    "tipo": "pacientes",
                                                    "id": 12,
                                                    "pode_abrir": true,
                                                    "web": "equipa/r/pacientes/12",
                                                    "app": "/r/pacientes/12"
                                                }
                                            },
                                            "lead_id": null,
                                            "campos": [
                                                "desconto",
                                                "validade"
                                            ],
                                            "detalhe": null,
                                            "origem": "app",
                                            "origem_rotulo": "Aplicação",
                                            "plataforma": "ios",
                                            "dispositivo": "Aplicação em ios · 1.0.0+1",
                                            "ip": "85.240.10.20",
                                            "metodo": "PUT",
                                            "http": 200,
                                            "duracao_ms": 84,
                                            "pedido_id": "b1c0…"
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/atividade/exportar": {
            "get": {
                "tags": [
                    "Atividade"
                ],
                "operationId": "atividadeExportar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "ver",
                "summary": "Exportar CSV (exige «exportar»; a exportação fica registada)",
                "parameters": [
                    {
                        "name": "f[ator]",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Pessoa da equipa"
                    },
                    {
                        "name": "f[ator_tipo]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "utilizador",
                                "paciente",
                                "integracao",
                                "sistema",
                                "anonimo"
                            ]
                        }
                    },
                    {
                        "name": "f[acao]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "entrou",
                                "saiu",
                                "falhou_entrada",
                                "abriu",
                                "viu",
                                "criou",
                                "alterou",
                                "eliminou",
                                "exportou",
                                "imprimiu",
                                "descarregou",
                                "enviou",
                                "assinou",
                                "aprovou",
                                "revogou",
                                "pesquisou",
                                "acesso_emergencia"
                            ]
                        }
                    },
                    {
                        "name": "f[familia]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "consultas",
                                "alteracoes",
                                "entradas",
                                "saidas"
                            ]
                        }
                    },
                    {
                        "name": "f[paciente]",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "f[alvo_tipo]",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[alvo_id]",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "f[pagina]",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Rótulo da página ou ecrã (igual)"
                    },
                    {
                        "name": "f[origem]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "web",
                                "app",
                                "api",
                                "integracao",
                                "agendador"
                            ]
                        }
                    },
                    {
                        "name": "f[de]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "f[ate]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "f[dia]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "f[hora]",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 23
                        }
                    },
                    {
                        "name": "f[q]",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Pessoa, página, detalhe ou endereço"
                    },
                    {
                        "name": "f[fora_horas]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "1"
                            ]
                        }
                    },
                    {
                        "name": "clinica",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Só para a gestão da plataforma: id de outra clínica ou «todas». Para os restantes é sempre a clínica do contexto."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "CSV",
                        "content": {
                            "text/csv": {
                                "schema": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/atividade/navegacao": {
            "post": {
                "tags": [
                    "Atividade"
                ],
                "operationId": "atividadeNavegacao",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "paciente": []
                    }
                ],
                "summary": "Navegação da app (ecrãs abertos, em lotes)",
                "description": "Até 50 eventos por lote; só o caminho (sem query), a chave do ecrã/recurso e o id numérico. O mesmo evento não se repete em 10 minutos; teto de 120 linhas por conta em 10 minutos. Quem envia regista só os seus próprios ecrãs. Efeito: linhas «abriu»/«viu» no registo de atividade.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "eventos": {
                                        "type": "array",
                                        "items": {
                                            "type": "object",
                                            "required": [
                                                "tipo",
                                                "rota"
                                            ],
                                            "properties": {
                                                "tipo": {
                                                    "type": "string",
                                                    "enum": [
                                                        "ecra",
                                                        "separador",
                                                        "folha"
                                                    ]
                                                },
                                                "rota": {
                                                    "type": "string"
                                                },
                                                "chave": {
                                                    "type": "string"
                                                },
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "titulo": {
                                                    "type": "string"
                                                },
                                                "em": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                }
                                            }
                                        }
                                    }
                                },
                                "required": [
                                    "eventos"
                                ]
                            },
                            "example": {
                                "eventos": [
                                    {
                                        "tipo": "ecra",
                                        "rota": "/e/funil",
                                        "chave": "funil",
                                        "em": "2026-10-28T10:01:00Z"
                                    },
                                    {
                                        "tipo": "ecra",
                                        "rota": "/r/pacientes/12",
                                        "chave": "pacientes",
                                        "id": 12
                                    }
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "aceites": {
                                                    "type": "integer"
                                                },
                                                "ignorados": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "aceites": 2,
                                        "ignorados": 0
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/atividade/pessoa/{id}": {
            "get": {
                "tags": [
                    "Atividade"
                ],
                "operationId": "atividadeDiaDaPessoa",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "ver",
                "summary": "O dia da pessoa",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "dia",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "pessoa": {
                                                    "type": "object"
                                                },
                                                "dia": {
                                                    "type": "string"
                                                },
                                                "primeira": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                },
                                                "ultima": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                },
                                                "total": {
                                                    "type": "integer"
                                                },
                                                "por_acao": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "por_hora": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "cronologia": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "integer"
                                                            },
                                                            "quando": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ],
                                                                "format": "date-time"
                                                            },
                                                            "clinica_id": {
                                                                "type": "integer"
                                                            },
                                                            "ator": {
                                                                "type": "object",
                                                                "properties": {
                                                                    "tipo": {
                                                                        "type": "string"
                                                                    },
                                                                    "id": {
                                                                        "type": [
                                                                            "integer",
                                                                            "null"
                                                                        ]
                                                                    },
                                                                    "nome": {
                                                                        "type": "string"
                                                                    },
                                                                    "perfil": {
                                                                        "type": [
                                                                            "string",
                                                                            "null"
                                                                        ]
                                                                    },
                                                                    "perfil_rotulo": {
                                                                        "type": [
                                                                            "string",
                                                                            "null"
                                                                        ]
                                                                    },
                                                                    "ligacao": {
                                                                        "type": [
                                                                            "object",
                                                                            "null"
                                                                        ],
                                                                        "properties": {
                                                                            "tipo": {
                                                                                "type": "string"
                                                                            },
                                                                            "id": {
                                                                                "type": "integer"
                                                                            },
                                                                            "pode_abrir": {
                                                                                "type": "boolean"
                                                                            },
                                                                            "web": {
                                                                                "type": [
                                                                                    "string",
                                                                                    "null"
                                                                                ]
                                                                            },
                                                                            "app": {
                                                                                "type": [
                                                                                    "string",
                                                                                    "null"
                                                                                ]
                                                                            }
                                                                        }
                                                                    }
                                                                }
                                                            },
                                                            "acao": {
                                                                "type": "string",
                                                                "enum": [
                                                                    "entrou",
                                                                    "saiu",
                                                                    "falhou_entrada",
                                                                    "abriu",
                                                                    "viu",
                                                                    "criou",
                                                                    "alterou",
                                                                    "eliminou",
                                                                    "exportou",
                                                                    "imprimiu",
                                                                    "descarregou",
                                                                    "enviou",
                                                                    "assinou",
                                                                    "aprovou",
                                                                    "revogou",
                                                                    "pesquisou",
                                                                    "acesso_emergencia"
                                                                ]
                                                            },
                                                            "acao_rotulo": {
                                                                "type": "string"
                                                            },
                                                            "tom": {
                                                                "type": "string"
                                                            },
                                                            "pagina": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "pagina_rotulo": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "modulo": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "ecra": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "alvo": {
                                                                "type": [
                                                                    "object",
                                                                    "null"
                                                                ],
                                                                "properties": {
                                                                    "tipo": {
                                                                        "type": "string"
                                                                    },
                                                                    "id": {
                                                                        "type": "integer"
                                                                    },
                                                                    "pode_abrir": {
                                                                        "type": "boolean"
                                                                    },
                                                                    "web": {
                                                                        "type": [
                                                                            "string",
                                                                            "null"
                                                                        ]
                                                                    },
                                                                    "app": {
                                                                        "type": [
                                                                            "string",
                                                                            "null"
                                                                        ]
                                                                    }
                                                                }
                                                            },
                                                            "paciente": {
                                                                "type": [
                                                                    "object",
                                                                    "null"
                                                                ],
                                                                "properties": {
                                                                    "id": {
                                                                        "type": "integer"
                                                                    },
                                                                    "nome": {
                                                                        "type": [
                                                                            "string",
                                                                            "null"
                                                                        ]
                                                                    },
                                                                    "ligacao": {
                                                                        "type": [
                                                                            "object",
                                                                            "null"
                                                                        ],
                                                                        "properties": {
                                                                            "tipo": {
                                                                                "type": "string"
                                                                            },
                                                                            "id": {
                                                                                "type": "integer"
                                                                            },
                                                                            "pode_abrir": {
                                                                                "type": "boolean"
                                                                            },
                                                                            "web": {
                                                                                "type": [
                                                                                    "string",
                                                                                    "null"
                                                                                ]
                                                                            },
                                                                            "app": {
                                                                                "type": [
                                                                                    "string",
                                                                                    "null"
                                                                                ]
                                                                            }
                                                                        }
                                                                    }
                                                                }
                                                            },
                                                            "lead_id": {
                                                                "type": [
                                                                    "integer",
                                                                    "null"
                                                                ]
                                                            },
                                                            "campos": {
                                                                "type": "array",
                                                                "items": {
                                                                    "type": "string"
                                                                }
                                                            },
                                                            "detalhe": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "origem": {
                                                                "type": "string",
                                                                "enum": [
                                                                    "web",
                                                                    "app",
                                                                    "api",
                                                                    "integracao",
                                                                    "agendador"
                                                                ]
                                                            },
                                                            "origem_rotulo": {
                                                                "type": "string"
                                                            },
                                                            "plataforma": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "dispositivo": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "ip": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "metodo": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "http": {
                                                                "type": [
                                                                    "integer",
                                                                    "null"
                                                                ]
                                                            },
                                                            "duracao_ms": {
                                                                "type": [
                                                                    "integer",
                                                                    "null"
                                                                ]
                                                            },
                                                            "pedido_id": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            }
                                                        }
                                                    }
                                                },
                                                "pacientes": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "aparelhos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/atividade/pessoas": {
            "get": {
                "tags": [
                    "Atividade"
                ],
                "operationId": "atividadePessoas",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "ver",
                "summary": "Pessoas presentes no registo (90 dias), para o filtro",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "integer"
                                                    },
                                                    "nome": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 7,
                                            "nome": "Inês Valente"
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/atividade/resumo": {
            "get": {
                "tags": [
                    "Atividade"
                ],
                "operationId": "atividadeResumo",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "ver",
                "summary": "Resumo do período filtrado",
                "description": "totais {acoes, pessoas, pacientes, paginas}; por_acao; pessoas (quem mais atua); paginas; pacientes mais vistos; serie {granularidade: hora|dia, pontos [{x, y, serie, familia}]}; em_foco [{tipo, tom, icone, titulo, texto, filtro}].",
                "parameters": [
                    {
                        "name": "f[ator]",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Pessoa da equipa"
                    },
                    {
                        "name": "f[ator_tipo]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "utilizador",
                                "paciente",
                                "integracao",
                                "sistema",
                                "anonimo"
                            ]
                        }
                    },
                    {
                        "name": "f[acao]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "entrou",
                                "saiu",
                                "falhou_entrada",
                                "abriu",
                                "viu",
                                "criou",
                                "alterou",
                                "eliminou",
                                "exportou",
                                "imprimiu",
                                "descarregou",
                                "enviou",
                                "assinou",
                                "aprovou",
                                "revogou",
                                "pesquisou",
                                "acesso_emergencia"
                            ]
                        }
                    },
                    {
                        "name": "f[familia]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "consultas",
                                "alteracoes",
                                "entradas",
                                "saidas"
                            ]
                        }
                    },
                    {
                        "name": "f[paciente]",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "f[alvo_tipo]",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[alvo_id]",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "f[pagina]",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Rótulo da página ou ecrã (igual)"
                    },
                    {
                        "name": "f[origem]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "web",
                                "app",
                                "api",
                                "integracao",
                                "agendador"
                            ]
                        }
                    },
                    {
                        "name": "f[de]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "f[ate]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "f[dia]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "f[hora]",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 23
                        }
                    },
                    {
                        "name": "f[q]",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Pessoa, página, detalhe ou endereço"
                    },
                    {
                        "name": "f[fora_horas]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "1"
                            ]
                        }
                    },
                    {
                        "name": "clinica",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Só para a gestão da plataforma: id de outra clínica ou «todas». Para os restantes é sempre a clínica do contexto."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "totais": {
                                            "acoes": 1840,
                                            "pessoas": 14,
                                            "pacientes": 212,
                                            "paginas": 37
                                        },
                                        "em_foco": [
                                            {
                                                "tipo": "saidas",
                                                "tom": "aviso",
                                                "icone": "exportar",
                                                "titulo": "6 exportações, impressões ou descargas",
                                                "texto": "Dados que saíram da plataforma no período.",
                                                "filtro": {
                                                    "familia": "saidas"
                                                }
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/atividade/{id}": {
            "get": {
                "tags": [
                    "Atividade"
                ],
                "operationId": "atividadeDetalhe",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "ver",
                "summary": "Uma linha do registo",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "quando": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                },
                                                "clinica_id": {
                                                    "type": "integer"
                                                },
                                                "ator": {
                                                    "type": "object",
                                                    "properties": {
                                                        "tipo": {
                                                            "type": "string"
                                                        },
                                                        "id": {
                                                            "type": [
                                                                "integer",
                                                                "null"
                                                            ]
                                                        },
                                                        "nome": {
                                                            "type": "string"
                                                        },
                                                        "perfil": {
                                                            "type": [
                                                                "string",
                                                                "null"
                                                            ]
                                                        },
                                                        "perfil_rotulo": {
                                                            "type": [
                                                                "string",
                                                                "null"
                                                            ]
                                                        },
                                                        "ligacao": {
                                                            "type": [
                                                                "object",
                                                                "null"
                                                            ],
                                                            "properties": {
                                                                "tipo": {
                                                                    "type": "string"
                                                                },
                                                                "id": {
                                                                    "type": "integer"
                                                                },
                                                                "pode_abrir": {
                                                                    "type": "boolean"
                                                                },
                                                                "web": {
                                                                    "type": [
                                                                        "string",
                                                                        "null"
                                                                    ]
                                                                },
                                                                "app": {
                                                                    "type": [
                                                                        "string",
                                                                        "null"
                                                                    ]
                                                                }
                                                            }
                                                        }
                                                    }
                                                },
                                                "acao": {
                                                    "type": "string",
                                                    "enum": [
                                                        "entrou",
                                                        "saiu",
                                                        "falhou_entrada",
                                                        "abriu",
                                                        "viu",
                                                        "criou",
                                                        "alterou",
                                                        "eliminou",
                                                        "exportou",
                                                        "imprimiu",
                                                        "descarregou",
                                                        "enviou",
                                                        "assinou",
                                                        "aprovou",
                                                        "revogou",
                                                        "pesquisou",
                                                        "acesso_emergencia"
                                                    ]
                                                },
                                                "acao_rotulo": {
                                                    "type": "string"
                                                },
                                                "tom": {
                                                    "type": "string"
                                                },
                                                "pagina": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "pagina_rotulo": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "modulo": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "ecra": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "alvo": {
                                                    "type": [
                                                        "object",
                                                        "null"
                                                    ],
                                                    "properties": {
                                                        "tipo": {
                                                            "type": "string"
                                                        },
                                                        "id": {
                                                            "type": "integer"
                                                        },
                                                        "pode_abrir": {
                                                            "type": "boolean"
                                                        },
                                                        "web": {
                                                            "type": [
                                                                "string",
                                                                "null"
                                                            ]
                                                        },
                                                        "app": {
                                                            "type": [
                                                                "string",
                                                                "null"
                                                            ]
                                                        }
                                                    }
                                                },
                                                "paciente": {
                                                    "type": [
                                                        "object",
                                                        "null"
                                                    ],
                                                    "properties": {
                                                        "id": {
                                                            "type": "integer"
                                                        },
                                                        "nome": {
                                                            "type": [
                                                                "string",
                                                                "null"
                                                            ]
                                                        },
                                                        "ligacao": {
                                                            "type": [
                                                                "object",
                                                                "null"
                                                            ],
                                                            "properties": {
                                                                "tipo": {
                                                                    "type": "string"
                                                                },
                                                                "id": {
                                                                    "type": "integer"
                                                                },
                                                                "pode_abrir": {
                                                                    "type": "boolean"
                                                                },
                                                                "web": {
                                                                    "type": [
                                                                        "string",
                                                                        "null"
                                                                    ]
                                                                },
                                                                "app": {
                                                                    "type": [
                                                                        "string",
                                                                        "null"
                                                                    ]
                                                                }
                                                            }
                                                        }
                                                    }
                                                },
                                                "lead_id": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                },
                                                "campos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "detalhe": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "origem": {
                                                    "type": "string",
                                                    "enum": [
                                                        "web",
                                                        "app",
                                                        "api",
                                                        "integracao",
                                                        "agendador"
                                                    ]
                                                },
                                                "origem_rotulo": {
                                                    "type": "string"
                                                },
                                                "plataforma": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "dispositivo": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "ip": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "metodo": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "http": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                },
                                                "duracao_ms": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                },
                                                "pedido_id": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 48211,
                                        "quando": "2026-10-28T10:14:03+00:00",
                                        "clinica_id": 1,
                                        "ator": {
                                            "tipo": "utilizador",
                                            "id": 7,
                                            "nome": "Inês Valente",
                                            "perfil": "medico",
                                            "perfil_rotulo": "Médico",
                                            "ligacao": {
                                                "tipo": "utilizadores",
                                                "id": 7,
                                                "pode_abrir": true,
                                                "web": "equipa/r/utilizadores/7",
                                                "app": "/r/utilizadores/7"
                                            }
                                        },
                                        "acao": "alterou",
                                        "acao_rotulo": "Alterou",
                                        "tom": "ouro",
                                        "pagina": "api/v1/r/propostas/31",
                                        "pagina_rotulo": "Propostas",
                                        "modulo": "comercial.propostas",
                                        "ecra": null,
                                        "alvo": {
                                            "tipo": "propostas",
                                            "id": 31,
                                            "pode_abrir": true,
                                            "web": "equipa/r/propostas/31",
                                            "app": "/r/propostas/31"
                                        },
                                        "paciente": {
                                            "id": 12,
                                            "nome": "Rita Matos",
                                            "ligacao": {
                                                "tipo": "pacientes",
                                                "id": 12,
                                                "pode_abrir": true,
                                                "web": "equipa/r/pacientes/12",
                                                "app": "/r/pacientes/12"
                                            }
                                        },
                                        "lead_id": null,
                                        "campos": [
                                            "desconto",
                                            "validade"
                                        ],
                                        "detalhe": null,
                                        "origem": "app",
                                        "origem_rotulo": "Aplicação",
                                        "plataforma": "ios",
                                        "dispositivo": "Aplicação em ios · 1.0.0+1",
                                        "ip": "85.240.10.20",
                                        "metodo": "PUT",
                                        "http": 200,
                                        "duracao_ms": 84,
                                        "pedido_id": "b1c0…"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/auditoria": {
            "get": {
                "tags": [
                    "Auditoria"
                ],
                "operationId": "auditoria",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Registo de auditoria",
                "description": "Filtros no topo (ator_id, paciente_id, acao, recurso, origem, de, ate) ou em f[…]. Datas AAAA-MM-DD. Exige Auditoria › Ver.",
                "parameters": [
                    {
                        "name": "ator_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "paciente_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "acao",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "ver",
                                "criar",
                                "alterar",
                                "apagar",
                                "exportar",
                                "imprimir",
                                "entrar",
                                "sair",
                                "falha_entrada",
                                "acesso_emergencia",
                                "aprovar",
                                "enviar",
                                "assinar",
                                "revogar",
                                "descarregar"
                            ]
                        }
                    },
                    {
                        "name": "recurso",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "origem",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "web",
                                "api",
                                "gancho",
                                "agendador"
                            ]
                        }
                    },
                    {
                        "name": "de",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/auditoria/exportar": {
            "get": {
                "tags": [
                    "Auditoria"
                ],
                "operationId": "auditoriaExportar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Exportar CSV (exige «exportar»; a exportação fica registada)",
                "responses": {
                    "200": {
                        "description": "CSV",
                        "content": {
                            "text/csv": {
                                "schema": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/auditoria/verificar": {
            "get": {
                "tags": [
                    "Auditoria"
                ],
                "operationId": "verificarCadeia",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Verificar a integridade da cadeia",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "integra": {
                                                    "type": "boolean"
                                                },
                                                "intacta": {
                                                    "type": "boolean"
                                                },
                                                "verificados": {
                                                    "type": "integer"
                                                },
                                                "primeira_quebra_id": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                },
                                                "quebra_em": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "integra": true,
                                        "intacta": true,
                                        "verificados": 18342,
                                        "primeira_quebra_id": null,
                                        "quebra_em": null
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            },
            "post": {
                "tags": [
                    "Auditoria"
                ],
                "operationId": "verificarCadeiaPost",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Verificar a integridade da cadeia",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/auditoria/{id}": {
            "get": {
                "tags": [
                    "Auditoria"
                ],
                "operationId": "auditoriaDetalhe",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Detalhe de uma linha",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/auth/2fa": {
            "post": {
                "tags": [
                    "Autenticação"
                ],
                "operationId": "segundoFator",
                "security": [],
                "summary": "Entrar (passo 2: código da aplicação ou de recuperação)",
                "description": "Na primeira configuração devolve também codigos_recuperacao (mostrar uma única vez).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "desafio": {
                                        "type": "string"
                                    },
                                    "codigo": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "desafio",
                                    "codigo"
                                ]
                            },
                            "example": {
                                "desafio": "Zk3…",
                                "codigo": "492817"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "description": "Passo seguinte (sigilo) ou tokens"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/auth/clinica": {
            "post": {
                "tags": [
                    "Escudo de entrada"
                ],
                "operationId": "escolherClinicaEntrada",
                "security": [],
                "summary": "Entrar: escolher a clínica (email com conta em várias)",
                "description": "Quando /auth/entrar responde {estado:\"clinica\", desafio, clinicas:[{utilizador_id, id, nome, logotipo_url, perfil, disponivel, estado, motivo}]}, envie o desafio e o id da clínica escolhida. Continua com o segundo fator e o termo de sigilo dessa conta (mesmas respostas de /auth/entrar). Só aparecem contas com a mesma palavra-passe; clínica com licença suspensa → 403 licenca_suspensa.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "desafio": {
                                        "type": "string"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dispositivo": {
                                        "type": "string"
                                    },
                                    "plataforma": {
                                        "type": "string"
                                    },
                                    "dispositivo_confiavel": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "desafio",
                                    "clinica_id"
                                ]
                            },
                            "example": {
                                "desafio": "Zk3…",
                                "clinica_id": 4
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "description": "Passo seguinte (2fa, sigilo) ou tokens"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "estado": "2fa",
                                        "desafio": "Qm8…",
                                        "expira_em": "2026-10-28T10:25:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/auth/desafio": {
            "post": {
                "tags": [
                    "Escudo de entrada"
                ],
                "operationId": "desafioEscudoEquipa",
                "security": [],
                "summary": "Desafio de verificação do dispositivo (equipa)",
                "description": "Sem estado (vai assinado), válido 300 s na app, uso único. Com dispositivo_confiavel a verificação é um nível mais leve. dados null quando o escudo está desligado. Limite de 30 pedidos por minuto por endereço.",
                "x-anagen-modulo": null,
                "x-anagen-nivel": null,
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "dispositivo_confiavel": {
                                        "type": "string"
                                    },
                                    "area": {
                                        "type": "string",
                                        "enum": [
                                            "equipa",
                                            "portal"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "dispositivo_confiavel": "eyJ2IjoxLCJk….a91f…"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": [
                                                "object",
                                                "null"
                                            ],
                                            "properties": {
                                                "desafio": {
                                                    "type": "string"
                                                },
                                                "salt": {
                                                    "type": "string",
                                                    "pattern": "^[0-9a-f]{32}$"
                                                },
                                                "bits": {
                                                    "type": "integer"
                                                },
                                                "nivel": {
                                                    "type": "integer",
                                                    "minimum": 0,
                                                    "maximum": 4
                                                },
                                                "valido_por": {
                                                    "type": "integer"
                                                },
                                                "minimo_ms": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "desafio": "eyJ2IjoxLCJpZCI6….9f2c…",
                                        "salt": "3f8a1c0e9b7d4a2f6e5c1b0a9d8e7f60",
                                        "bits": 17,
                                        "nivel": 0,
                                        "valido_por": 300,
                                        "minimo_ms": 0
                                    }
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/auth/entrar": {
            "post": {
                "tags": [
                    "Autenticação"
                ],
                "operationId": "entrar",
                "security": [],
                "summary": "Entrar (passo 1: email e palavra-passe)",
                "description": "Devolve o passo seguinte: {estado:\"2fa\", desafio} (com configurar:true, segredo e otpauth quando o segundo fator ainda não está configurado), {estado:\"sigilo\", desafio, termo} ou, concluída a entrada, os tokens. O desafio vale 10 minutos e 5 tentativas.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "email": {
                                        "type": "string",
                                        "format": "email"
                                    },
                                    "palavra_passe": {
                                        "type": "string"
                                    },
                                    "dispositivo": {
                                        "type": "string"
                                    },
                                    "plataforma": {
                                        "type": "string",
                                        "enum": [
                                            "android",
                                            "ios",
                                            "web",
                                            "outro"
                                        ]
                                    }
                                },
                                "required": [
                                    "email",
                                    "palavra_passe"
                                ]
                            },
                            "example": {
                                "email": "ines@clinica.pt",
                                "palavra_passe": "••••••••••••",
                                "dispositivo": "Pixel 9",
                                "plataforma": "android"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "oneOf": [
                                                {
                                                    "type": "object",
                                                    "properties": {
                                                        "estado": {
                                                            "const": "2fa"
                                                        },
                                                        "desafio": {
                                                            "type": "string"
                                                        },
                                                        "expira_em": {
                                                            "type": [
                                                                "string",
                                                                "null"
                                                            ],
                                                            "format": "date-time"
                                                        },
                                                        "configurar": {
                                                            "type": "boolean"
                                                        },
                                                        "segredo": {
                                                            "type": "string"
                                                        },
                                                        "otpauth": {
                                                            "type": "string"
                                                        }
                                                    }
                                                },
                                                {
                                                    "type": "object",
                                                    "properties": {
                                                        "estado": {
                                                            "const": "sigilo"
                                                        },
                                                        "desafio": {
                                                            "type": "string"
                                                        },
                                                        "termo": {
                                                            "type": "object",
                                                            "properties": {
                                                                "versao": {
                                                                    "type": "integer"
                                                                },
                                                                "texto": {
                                                                    "type": "string"
                                                                }
                                                            }
                                                        }
                                                    }
                                                },
                                                {
                                                    "type": "object",
                                                    "properties": {
                                                        "acesso": {
                                                            "type": "string"
                                                        },
                                                        "renovacao": {
                                                            "type": "string"
                                                        },
                                                        "expira_em": {
                                                            "type": "string",
                                                            "format": "date-time"
                                                        },
                                                        "renovacao_expira_em": {
                                                            "type": "string",
                                                            "format": "date-time"
                                                        },
                                                        "tipo": {
                                                            "type": "string",
                                                            "enum": [
                                                                "equipa",
                                                                "paciente"
                                                            ]
                                                        },
                                                        "conta": {
                                                            "type": "object"
                                                        },
                                                        "codigos_recuperacao": {
                                                            "type": [
                                                                "array",
                                                                "null"
                                                            ],
                                                            "items": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                }
                                            ]
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "estado": "2fa",
                                        "desafio": "Zk3…",
                                        "expira_em": "2026-10-28T10:25:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/auth/renovar": {
            "post": {
                "tags": [
                    "Autenticação"
                ],
                "operationId": "renovar",
                "security": [],
                "summary": "Renovar tokens (rotação)",
                "description": "Cada renovação devolve um par novo e invalida o anterior. Reutilizar um token de renovação já usado termina toda a sessão (família) por segurança — a app volta ao ecrã de entrada.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "renovacao": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "renovacao"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "acesso": {
                                                    "type": "string"
                                                },
                                                "renovacao": {
                                                    "type": "string"
                                                },
                                                "expira_em": {
                                                    "type": "string",
                                                    "format": "date-time"
                                                },
                                                "renovacao_expira_em": {
                                                    "type": "string",
                                                    "format": "date-time"
                                                },
                                                "tipo": {
                                                    "type": "string",
                                                    "enum": [
                                                        "equipa",
                                                        "paciente"
                                                    ]
                                                },
                                                "conta": {
                                                    "type": "object"
                                                },
                                                "codigos_recuperacao": {
                                                    "type": [
                                                        "array",
                                                        "null"
                                                    ],
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "acesso": "ax_a_3M1q…",
                                        "renovacao": "ax_r_Qp9w…",
                                        "expira_em": "2026-10-28T10:35:00+00:00",
                                        "tipo": "equipa",
                                        "conta": {
                                            "id": 7,
                                            "nome": "Inês Valente",
                                            "email": "ines@clinica.pt",
                                            "perfil": "medico",
                                            "clinica": 1
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/auth/sair": {
            "post": {
                "tags": [
                    "Autenticação"
                ],
                "operationId": "sair",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "paciente": []
                    },
                    {
                        "integracao": []
                    }
                ],
                "summary": "Sair",
                "description": "Termina a sessão atual; com {todas:true} termina todas as sessões da conta (web e app).",
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "todas": {
                                        "type": "boolean"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                },
                                                "todas": {
                                                    "type": "boolean"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    }
                }
            }
        },
        "/auth/sigilo": {
            "post": {
                "tags": [
                    "Autenticação"
                ],
                "operationId": "aceitarSigilo",
                "security": [],
                "summary": "Entrar (passo 3: aceitar o termo de sigilo)",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "desafio": {
                                        "type": "string"
                                    },
                                    "aceitar": {
                                        "type": "boolean"
                                    }
                                },
                                "required": [
                                    "desafio",
                                    "aceitar"
                                ]
                            },
                            "example": {
                                "desafio": "Zk3…",
                                "aceitar": true
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "acesso": {
                                                    "type": "string"
                                                },
                                                "renovacao": {
                                                    "type": "string"
                                                },
                                                "expira_em": {
                                                    "type": "string",
                                                    "format": "date-time"
                                                },
                                                "renovacao_expira_em": {
                                                    "type": "string",
                                                    "format": "date-time"
                                                },
                                                "tipo": {
                                                    "type": "string",
                                                    "enum": [
                                                        "equipa",
                                                        "paciente"
                                                    ]
                                                },
                                                "conta": {
                                                    "type": "object"
                                                },
                                                "codigos_recuperacao": {
                                                    "type": [
                                                        "array",
                                                        "null"
                                                    ],
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "acesso": "ax_a_3M1q…",
                                        "renovacao": "ax_r_Qp9w…",
                                        "expira_em": "2026-10-28T10:35:00+00:00",
                                        "tipo": "equipa",
                                        "conta": {
                                            "id": 7,
                                            "nome": "Inês Valente",
                                            "email": "ines@clinica.pt",
                                            "perfil": "medico",
                                            "clinica": 1
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bi/tokens": {
            "get": {
                "tags": [
                    "Exportação"
                ],
                "operationId": "listarTokensBi",
                "summary": "Os meus tokens de BI",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/TokenBi"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            },
            "post": {
                "tags": [
                    "Exportação"
                ],
                "operationId": "criarTokenBi",
                "summary": "Criar token de leitura para BI",
                "description": "O token (axbi_…) só é devolvido nesta resposta. Usa-se em GET /bi/<conjunto>.csv|json na raiz do site, com «Authorization: Bearer» ou «?token=», e lê com as permissões ATUAIS da pessoa.",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "nome",
                                    "conjuntos"
                                ],
                                "properties": {
                                    "nome": {
                                        "type": "string",
                                        "maxLength": 120
                                    },
                                    "conjuntos": {
                                        "type": "array",
                                        "items": {
                                            "type": "string",
                                            "enum": [
                                                "indicadores_financeiros",
                                                "indicadores_vendas",
                                                "indicadores_operacionais",
                                                "indicadores_atendimento",
                                                "tarefas"
                                            ]
                                        }
                                    },
                                    "dias": {
                                        "type": "integer",
                                        "minimum": 1,
                                        "maximum": 730,
                                        "default": 365
                                    }
                                }
                            },
                            "example": {
                                "nome": "Painel da direção",
                                "conjuntos": [
                                    "indicadores_vendas",
                                    "indicadores_financeiros"
                                ],
                                "dias": 365
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "token": {
                                                    "type": "string"
                                                },
                                                "prefixo": {
                                                    "type": "string"
                                                },
                                                "segredo_visivel_uma_vez": {
                                                    "type": "string"
                                                },
                                                "endereco": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 3,
                                        "token": "axbi_4f…",
                                        "prefixo": "axbi_4f1c2a",
                                        "segredo_visivel_uma_vez": "axbi_4f…",
                                        "endereco": "https://anagen.pt/bi"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/bi/tokens/{id}": {
            "delete": {
                "tags": [
                    "Exportação"
                ],
                "operationId": "revogarTokenBi",
                "summary": "Revogar token de BI",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ok": {
                                                    "type": "boolean"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/bloco/checklists/{id}/itens": {
            "post": {
                "tags": [
                    "Mapa de cirurgias"
                ],
                "operationId": "m6MarcarItemChecklist",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da checklist"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "summary": "Marcar ou desmarcar um item da checklist",
                "description": "Exige «bloco.registo» editar (nas checklists pré-operatórias também serve «bloco.marcar» editar). Regista quem e quando; a checklist conclui-se quando todos os obrigatórios estão feitos e reabre se um for desmarcado; a pré-operatória alimenta o indicador «checklist» do mapa. Cirurgia concluída ou cancelada → 409. Índice inexistente → 422. Efeitos: auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "indice": {
                                        "type": "integer",
                                        "minimum": 0,
                                        "description": "Posição do item (a começar em 0)."
                                    },
                                    "feito": {
                                        "type": "boolean"
                                    }
                                },
                                "required": [
                                    "indice",
                                    "feito"
                                ]
                            },
                            "example": {
                                "indice": 1,
                                "feito": true
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Checklist"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 611,
                                        "nome": "Verificação de segurança antes da cirurgia",
                                        "fase": "pre_operatorio",
                                        "fase_rotulo": "Pré-operatório",
                                        "estado": "aberta",
                                        "itens": [
                                            {
                                                "texto": "Identidade do paciente confirmada",
                                                "responsavel_papel": "enfermeiro",
                                                "obrigatorio": true,
                                                "feito": true,
                                                "feito_por": 19,
                                                "feito_por_nome": "Paulo Matos",
                                                "feito_em": "2026-11-17T16:20:00+00:00"
                                            },
                                            {
                                                "texto": "Análises pré-operatórias revistas",
                                                "responsavel_papel": "cirurgiao",
                                                "obrigatorio": true,
                                                "feito": false,
                                                "feito_por": null,
                                                "feito_por_nome": null,
                                                "feito_em": null
                                            },
                                            {
                                                "texto": "Fotografias pré-operatórias tiradas",
                                                "responsavel_papel": "tecnico",
                                                "obrigatorio": false,
                                                "feito": false,
                                                "feito_por": null,
                                                "feito_por_nome": null,
                                                "feito_em": null
                                            }
                                        ],
                                        "feitos": 1,
                                        "total": 3,
                                        "concluida_em": null
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "A sessão já está fechada."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/cirurgias": {
            "post": {
                "tags": [
                    "Mapa de cirurgias"
                ],
                "operationId": "m6CriarCirurgia",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.marcar",
                "x-anagen-nivel": "editar",
                "summary": "Criar cirurgia à mão",
                "description": "Para cirurgias sem proposta (por exemplo uma segunda sessão já paga): fica pré-marcada, com número próprio e aptidão «por avaliar». O valor do ato só é aceite de quem tem «financeiro.valores» editar. Com «inicio» e «sala_id» reserva logo o dia e a sala (regras de POST /bloco/cirurgias/{id}/reservar); se a reserva falhar por conflito, a cirurgia fica criada como pré-marcada (ver GET /bloco/por-agendar) e o pedido devolve 409. Efeitos: auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "paciente_id": {
                                        "type": "integer"
                                    },
                                    "episodio_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "tecnica": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "enum": [
                                            "FUE",
                                            "FUT",
                                            "DHI",
                                            "outra",
                                            null
                                        ]
                                    },
                                    "enxertos_planeados": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "minimum": 1,
                                        "maximum": 10000,
                                        "x-unidade": "enxertos"
                                    },
                                    "valor_ato": {
                                        "type": [
                                            "number",
                                            "null"
                                        ],
                                        "x-moeda": "EUR",
                                        "description": "Valor do ato (só com «financeiro.valores» editar)."
                                    },
                                    "inicio": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date-time",
                                        "description": "Reservar já para este início."
                                    },
                                    "sala_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "description": "Sala para a reserva imediata."
                                    },
                                    "forcar": {
                                        "type": "boolean",
                                        "description": "Aceitar os avisos (conflito_aviso: feriado, fora do horário, sem horário, data passada). Nunca anula conflitos bloqueantes."
                                    }
                                },
                                "required": [
                                    "paciente_id"
                                ]
                            },
                            "example": {
                                "paciente_id": 1204,
                                "episodio_id": 77,
                                "tecnica": "FUE",
                                "enxertos_planeados": 2850,
                                "inicio": "2026-11-18T08:30:00+00:00",
                                "sala_id": 5
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Cirurgia"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 214,
                                        "numero": "CIR-2026-0214",
                                        "estado": "reservada",
                                        "estado_rotulo": "Reservada",
                                        "estado_tom": "ouro",
                                        "paciente_id": 1204,
                                        "paciente_nome": "Rui Almeida",
                                        "episodio_id": 77,
                                        "proposta_id": null,
                                        "plano_id": null,
                                        "marcacao_id": 8902,
                                        "sala_id": 5,
                                        "sala_nome": "Bloco 1",
                                        "inicio_previsto": "2026-11-18T08:30:00+00:00",
                                        "fim_previsto": "2026-11-18T14:30:00+00:00",
                                        "tecnica": "FUE",
                                        "enxertos_planeados": 2850,
                                        "aptidao": "por_avaliar",
                                        "aptidao_rotulo": "Por avaliar",
                                        "validada_por": null,
                                        "validada_em": null,
                                        "confirmada_em": null,
                                        "indicadores": [
                                            {
                                                "chave": "confirmada",
                                                "rotulo": "Confirmada",
                                                "ok": false
                                            },
                                            {
                                                "chave": "sinal",
                                                "rotulo": "Sinal pago",
                                                "ok": true
                                            },
                                            {
                                                "chave": "consentimento",
                                                "rotulo": "Consentimento",
                                                "ok": true
                                            },
                                            {
                                                "chave": "analises",
                                                "rotulo": "Análises",
                                                "ok": true
                                            },
                                            {
                                                "chave": "checklist",
                                                "rotulo": "Checklist",
                                                "ok": false
                                            }
                                        ],
                                        "equipa": [],
                                        "valor_ato": null,
                                        "valores_visiveis": true,
                                        "enxertos_extraidos": null,
                                        "enxertos_implantados": null,
                                        "cabelos_total": null,
                                        "fechada_em": null,
                                        "motivo_cancelamento": null,
                                        "acoes": [
                                            "reservar",
                                            "equipa",
                                            "aptidao",
                                            "confirmar",
                                            "analises",
                                            "cancelar",
                                            "checklist"
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (conflito, conflito_aviso, estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "conflito": {
                                        "summary": "conflito",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "conflito",
                                                "mensagem": "Há conflitos na agenda.",
                                                "campos": {
                                                    "participantes": "Marta Sousa já tem uma marcação das 09:00–13:00.",
                                                    "sala_id": "Bloco 1 está ocupada (a partir das 08:30)."
                                                }
                                            }
                                        }
                                    },
                                    "conflito_aviso": {
                                        "summary": "conflito_aviso",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "conflito_aviso",
                                                "mensagem": "Há avisos na agenda. Confirme para continuar.",
                                                "campos": {
                                                    "inicio": "A data já passou."
                                                }
                                            }
                                        }
                                    },
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Esta cirurgia já não pode ser mudada."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/cirurgias/{id}": {
            "get": {
                "tags": [
                    "Mapa de cirurgias"
                ],
                "operationId": "m6ObterCirurgia",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "bloco.mapa",
                "x-anagen-nivel": "ver",
                "summary": "Detalhe da cirurgia",
                "description": "Estado, datas previstas, sala, técnica, enxertos planeados, aptidão, validação, indicadores, equipa, checklists pré-operatórias e as ações possíveis para quem pede. Vista por perfil: o valor do ato só sai com «financeiro.valores» (âmbito «todos», ou nas cirurgias em que participa ou que reservou); os honorários de cada pessoa só saem com âmbito «todos» (senão só os próprios). A leitura fica na auditoria.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Cirurgia"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 214,
                                        "numero": "CIR-2026-0214",
                                        "estado": "validada",
                                        "estado_rotulo": "Validada",
                                        "estado_tom": "info",
                                        "paciente_id": 1204,
                                        "paciente_nome": "Rui Almeida",
                                        "episodio_id": 77,
                                        "proposta_id": 91,
                                        "plano_id": 318,
                                        "marcacao_id": 8902,
                                        "sala_id": 5,
                                        "sala_nome": "Bloco 1",
                                        "inicio_previsto": "2026-11-18T08:30:00+00:00",
                                        "fim_previsto": "2026-11-18T14:30:00+00:00",
                                        "tecnica": "FUE",
                                        "enxertos_planeados": 2850,
                                        "aptidao": "apto",
                                        "aptidao_rotulo": "Apto",
                                        "validada_por": "Inês Valente",
                                        "validada_em": "2026-10-28T11:05:00+00:00",
                                        "confirmada_em": null,
                                        "indicadores": [
                                            {
                                                "chave": "confirmada",
                                                "rotulo": "Confirmada",
                                                "ok": false
                                            },
                                            {
                                                "chave": "sinal",
                                                "rotulo": "Sinal pago",
                                                "ok": true
                                            },
                                            {
                                                "chave": "consentimento",
                                                "rotulo": "Consentimento",
                                                "ok": true
                                            },
                                            {
                                                "chave": "analises",
                                                "rotulo": "Análises",
                                                "ok": true
                                            },
                                            {
                                                "chave": "checklist",
                                                "rotulo": "Checklist",
                                                "ok": false
                                            }
                                        ],
                                        "equipa": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "valor_ato": 5900,
                                        "valores_visiveis": true,
                                        "enxertos_extraidos": null,
                                        "enxertos_implantados": null,
                                        "cabelos_total": null,
                                        "fechada_em": null,
                                        "motivo_cancelamento": null,
                                        "acoes": [
                                            "reservar",
                                            "equipa",
                                            "aptidao",
                                            "confirmar",
                                            "analises",
                                            "cancelar",
                                            "checklist"
                                        ],
                                        "checklists": [
                                            {
                                                "id": 611,
                                                "nome": "Verificação de segurança antes da cirurgia",
                                                "fase": "pre_operatorio",
                                                "fase_rotulo": "Pré-operatório",
                                                "estado": "aberta",
                                                "itens": [
                                                    {
                                                        "texto": "Identidade do paciente confirmada",
                                                        "responsavel_papel": "enfermeiro",
                                                        "obrigatorio": true,
                                                        "feito": true,
                                                        "feito_por": 19,
                                                        "feito_por_nome": "Paulo Matos",
                                                        "feito_em": "2026-11-17T16:20:00+00:00"
                                                    },
                                                    {
                                                        "texto": "Análises pré-operatórias revistas",
                                                        "responsavel_papel": "cirurgiao",
                                                        "obrigatorio": true,
                                                        "feito": false,
                                                        "feito_por": null,
                                                        "feito_por_nome": null,
                                                        "feito_em": null
                                                    },
                                                    {
                                                        "texto": "Fotografias pré-operatórias tiradas",
                                                        "responsavel_papel": "tecnico",
                                                        "obrigatorio": false,
                                                        "feito": false,
                                                        "feito_por": null,
                                                        "feito_por_nome": null,
                                                        "feito_em": null
                                                    }
                                                ],
                                                "feitos": 1,
                                                "total": 3,
                                                "concluida_em": null
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/cirurgias/{id}/analises": {
            "post": {
                "tags": [
                    "Mapa de cirurgias"
                ],
                "operationId": "m6AnalisesCirurgia",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.marcar",
                "x-anagen-nivel": "editar",
                "summary": "Análises pré-operatórias recebidas",
                "description": "Liga ou desliga o indicador «análises». Exige «bloco.marcar» editar ou «bloco.registo» editar. Efeitos: auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "ok": {
                                        "type": "boolean"
                                    }
                                },
                                "required": [
                                    "ok"
                                ]
                            },
                            "example": {
                                "ok": true
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Cirurgia"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 214,
                                        "numero": "CIR-2026-0214",
                                        "estado": "validada",
                                        "estado_rotulo": "Validada",
                                        "estado_tom": "info",
                                        "paciente_id": 1204,
                                        "paciente_nome": "Rui Almeida",
                                        "episodio_id": 77,
                                        "proposta_id": 91,
                                        "plano_id": 318,
                                        "marcacao_id": 8902,
                                        "sala_id": 5,
                                        "sala_nome": "Bloco 1",
                                        "inicio_previsto": "2026-11-18T08:30:00+00:00",
                                        "fim_previsto": "2026-11-18T14:30:00+00:00",
                                        "tecnica": "FUE",
                                        "enxertos_planeados": 2850,
                                        "aptidao": "apto",
                                        "aptidao_rotulo": "Apto",
                                        "validada_por": "Inês Valente",
                                        "validada_em": "2026-10-28T11:05:00+00:00",
                                        "confirmada_em": null,
                                        "indicadores": [
                                            {
                                                "chave": "confirmada",
                                                "rotulo": "Confirmada",
                                                "ok": false
                                            },
                                            {
                                                "chave": "sinal",
                                                "rotulo": "Sinal pago",
                                                "ok": true
                                            },
                                            {
                                                "chave": "consentimento",
                                                "rotulo": "Consentimento",
                                                "ok": true
                                            },
                                            {
                                                "chave": "analises",
                                                "rotulo": "Análises",
                                                "ok": true
                                            },
                                            {
                                                "chave": "checklist",
                                                "rotulo": "Checklist",
                                                "ok": false
                                            }
                                        ],
                                        "equipa": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "valor_ato": 5900,
                                        "valores_visiveis": true,
                                        "enxertos_extraidos": null,
                                        "enxertos_implantados": null,
                                        "cabelos_total": null,
                                        "fechada_em": null,
                                        "motivo_cancelamento": null,
                                        "acoes": [
                                            "reservar",
                                            "equipa",
                                            "aptidao",
                                            "confirmar",
                                            "analises",
                                            "cancelar",
                                            "checklist"
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/cirurgias/{id}/aptidao": {
            "post": {
                "tags": [
                    "Mapa de cirurgias"
                ],
                "operationId": "m6AptidaoCirurgia",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.marcar",
                "x-anagen-nivel": "aprovar",
                "summary": "Aptidão pré-operatória (decisão médica)",
                "description": "Exige «aprovar» em «bloco.marcar». Uma aptidão diferente de «apto» numa cirurgia validada ou confirmada devolve-a a «reservada» e avisa quem validou. Efeitos: auditoria «aprovar».",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "aptidao": {
                                        "type": "string",
                                        "enum": [
                                            "por_avaliar",
                                            "apto",
                                            "nao_apto"
                                        ]
                                    }
                                },
                                "required": [
                                    "aptidao"
                                ]
                            },
                            "example": {
                                "aptidao": "apto"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Cirurgia"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 214,
                                        "numero": "CIR-2026-0214",
                                        "estado": "validada",
                                        "estado_rotulo": "Validada",
                                        "estado_tom": "info",
                                        "paciente_id": 1204,
                                        "paciente_nome": "Rui Almeida",
                                        "episodio_id": 77,
                                        "proposta_id": 91,
                                        "plano_id": 318,
                                        "marcacao_id": 8902,
                                        "sala_id": 5,
                                        "sala_nome": "Bloco 1",
                                        "inicio_previsto": "2026-11-18T08:30:00+00:00",
                                        "fim_previsto": "2026-11-18T14:30:00+00:00",
                                        "tecnica": "FUE",
                                        "enxertos_planeados": 2850,
                                        "aptidao": "apto",
                                        "aptidao_rotulo": "Apto",
                                        "validada_por": "Inês Valente",
                                        "validada_em": "2026-10-28T11:05:00+00:00",
                                        "confirmada_em": null,
                                        "indicadores": [
                                            {
                                                "chave": "confirmada",
                                                "rotulo": "Confirmada",
                                                "ok": false
                                            },
                                            {
                                                "chave": "sinal",
                                                "rotulo": "Sinal pago",
                                                "ok": true
                                            },
                                            {
                                                "chave": "consentimento",
                                                "rotulo": "Consentimento",
                                                "ok": true
                                            },
                                            {
                                                "chave": "analises",
                                                "rotulo": "Análises",
                                                "ok": true
                                            },
                                            {
                                                "chave": "checklist",
                                                "rotulo": "Checklist",
                                                "ok": false
                                            }
                                        ],
                                        "equipa": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "valor_ato": 5900,
                                        "valores_visiveis": true,
                                        "enxertos_extraidos": null,
                                        "enxertos_implantados": null,
                                        "cabelos_total": null,
                                        "fechada_em": null,
                                        "motivo_cancelamento": null,
                                        "acoes": [
                                            "reservar",
                                            "equipa",
                                            "aptidao",
                                            "confirmar",
                                            "analises",
                                            "cancelar",
                                            "checklist"
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/cirurgias/{id}/cancelar": {
            "post": {
                "tags": [
                    "Mapa de cirurgias"
                ],
                "operationId": "m6CancelarCirurgia",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.marcar",
                "x-anagen-nivel": "editar",
                "summary": "Cancelar a cirurgia",
                "description": "Só em estados planeáveis (409). Motivo obrigatório (até 255 caracteres). Cancela também o bloco na agenda e notifica a equipa com o motivo. Efeitos: auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": "string",
                                        "minLength": 1,
                                        "maxLength": 255
                                    }
                                },
                                "required": [
                                    "motivo"
                                ]
                            },
                            "example": {
                                "motivo": "Paciente pediu para adiar por motivos profissionais."
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Cirurgia"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 214,
                                        "numero": "CIR-2026-0214",
                                        "estado": "cancelada",
                                        "estado_rotulo": "Cancelada",
                                        "estado_tom": "perigo",
                                        "paciente_id": 1204,
                                        "paciente_nome": "Rui Almeida",
                                        "episodio_id": 77,
                                        "proposta_id": 91,
                                        "plano_id": 318,
                                        "marcacao_id": 8902,
                                        "sala_id": 5,
                                        "sala_nome": "Bloco 1",
                                        "inicio_previsto": "2026-11-18T08:30:00+00:00",
                                        "fim_previsto": "2026-11-18T14:30:00+00:00",
                                        "tecnica": "FUE",
                                        "enxertos_planeados": 2850,
                                        "aptidao": "apto",
                                        "aptidao_rotulo": "Apto",
                                        "validada_por": "Inês Valente",
                                        "validada_em": "2026-10-28T11:05:00+00:00",
                                        "confirmada_em": null,
                                        "indicadores": [
                                            {
                                                "chave": "confirmada",
                                                "rotulo": "Confirmada",
                                                "ok": false
                                            },
                                            {
                                                "chave": "sinal",
                                                "rotulo": "Sinal pago",
                                                "ok": true
                                            },
                                            {
                                                "chave": "consentimento",
                                                "rotulo": "Consentimento",
                                                "ok": true
                                            },
                                            {
                                                "chave": "analises",
                                                "rotulo": "Análises",
                                                "ok": true
                                            },
                                            {
                                                "chave": "checklist",
                                                "rotulo": "Checklist",
                                                "ok": false
                                            }
                                        ],
                                        "equipa": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "valor_ato": 5900,
                                        "valores_visiveis": true,
                                        "enxertos_extraidos": null,
                                        "enxertos_implantados": null,
                                        "cabelos_total": null,
                                        "fechada_em": null,
                                        "motivo_cancelamento": "Paciente pediu para adiar por motivos profissionais.",
                                        "acoes": []
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Esta cirurgia já não pode ser mudada."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/cirurgias/{id}/checklist": {
            "post": {
                "tags": [
                    "Mapa de cirurgias"
                ],
                "operationId": "m6ChecklistPreOperatoria",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.mapa",
                "x-anagen-nivel": "ver",
                "summary": "Criar as checklists pré-operatórias",
                "description": "Cria (uma única vez) as checklists dos modelos ativos da fase «pré-operatório» (lista de verificação de segurança cirúrgica). A ação é oferecida em M6Cirurgia.acoes a quem regista no bloco ou vê as marcações cirúrgicas. Devolve os ids e o detalhe atualizado.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ids": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "integer"
                                                    }
                                                },
                                                "cirurgia": {
                                                    "$ref": "#/components/schemas/M6Cirurgia"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ids": [
                                            611
                                        ],
                                        "cirurgia": {
                                            "id": 214,
                                            "numero": "CIR-2026-0214",
                                            "estado": "validada",
                                            "estado_rotulo": "Validada",
                                            "estado_tom": "info",
                                            "paciente_id": 1204,
                                            "paciente_nome": "Rui Almeida",
                                            "episodio_id": 77,
                                            "proposta_id": 91,
                                            "plano_id": 318,
                                            "marcacao_id": 8902,
                                            "sala_id": 5,
                                            "sala_nome": "Bloco 1",
                                            "inicio_previsto": "2026-11-18T08:30:00+00:00",
                                            "fim_previsto": "2026-11-18T14:30:00+00:00",
                                            "tecnica": "FUE",
                                            "enxertos_planeados": 2850,
                                            "aptidao": "apto",
                                            "aptidao_rotulo": "Apto",
                                            "validada_por": "Inês Valente",
                                            "validada_em": "2026-10-28T11:05:00+00:00",
                                            "confirmada_em": null,
                                            "indicadores": [
                                                {
                                                    "chave": "confirmada",
                                                    "rotulo": "Confirmada",
                                                    "ok": false
                                                },
                                                {
                                                    "chave": "sinal",
                                                    "rotulo": "Sinal pago",
                                                    "ok": true
                                                },
                                                {
                                                    "chave": "consentimento",
                                                    "rotulo": "Consentimento",
                                                    "ok": true
                                                },
                                                {
                                                    "chave": "analises",
                                                    "rotulo": "Análises",
                                                    "ok": true
                                                },
                                                {
                                                    "chave": "checklist",
                                                    "rotulo": "Checklist",
                                                    "ok": false
                                                }
                                            ],
                                            "equipa": [
                                                {
                                                    "utilizador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "cor": "#7A4E9C",
                                                    "papel": "cirurgiao",
                                                    "papel_rotulo": "Cirurgião",
                                                    "honorarios_valor": 1200
                                                },
                                                {
                                                    "utilizador_id": 15,
                                                    "nome": "Marta Sousa",
                                                    "cor": "#C0743A",
                                                    "papel": "assistente",
                                                    "papel_rotulo": "Assistente"
                                                },
                                                {
                                                    "utilizador_id": 19,
                                                    "nome": "Paulo Matos",
                                                    "cor": "#3A7BC0",
                                                    "papel": "enfermeiro",
                                                    "papel_rotulo": "Enfermeiro"
                                                }
                                            ],
                                            "valor_ato": 5900,
                                            "valores_visiveis": true,
                                            "enxertos_extraidos": null,
                                            "enxertos_implantados": null,
                                            "cabelos_total": null,
                                            "fechada_em": null,
                                            "motivo_cancelamento": null,
                                            "acoes": [
                                                "reservar",
                                                "equipa",
                                                "aptidao",
                                                "confirmar",
                                                "analises",
                                                "cancelar",
                                                "checklist"
                                            ],
                                            "checklists": [
                                                {
                                                    "id": 611,
                                                    "nome": "Verificação de segurança antes da cirurgia",
                                                    "fase": "pre_operatorio",
                                                    "fase_rotulo": "Pré-operatório",
                                                    "estado": "aberta",
                                                    "itens": [
                                                        {
                                                            "texto": "Identidade do paciente confirmada",
                                                            "responsavel_papel": "enfermeiro",
                                                            "obrigatorio": true,
                                                            "feito": true,
                                                            "feito_por": 19,
                                                            "feito_por_nome": "Paulo Matos",
                                                            "feito_em": "2026-11-17T16:20:00+00:00"
                                                        },
                                                        {
                                                            "texto": "Análises pré-operatórias revistas",
                                                            "responsavel_papel": "cirurgiao",
                                                            "obrigatorio": true,
                                                            "feito": false,
                                                            "feito_por": null,
                                                            "feito_por_nome": null,
                                                            "feito_em": null
                                                        },
                                                        {
                                                            "texto": "Fotografias pré-operatórias tiradas",
                                                            "responsavel_papel": "tecnico",
                                                            "obrigatorio": false,
                                                            "feito": false,
                                                            "feito_por": null,
                                                            "feito_por_nome": null,
                                                            "feito_em": null
                                                        }
                                                    ],
                                                    "feitos": 1,
                                                    "total": 3,
                                                    "concluida_em": null
                                                }
                                            ]
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/cirurgias/{id}/confirmar": {
            "post": {
                "tags": [
                    "Mapa de cirurgias"
                ],
                "operationId": "m6ConfirmarCirurgia",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.marcar",
                "x-anagen-nivel": "editar",
                "summary": "Confirmar a cirurgia",
                "description": "Só a partir de «validada» (409). Não confirma sem consentimento cirúrgico válido (verificado no módulo de conformidade quando existe; senão o último consentimento «cirurgico» do núcleo) — 422 «consentimento_em_falta» — nem sem aptidão «apto» — 422 «aptidao_em_falta». Efeitos: bloco da agenda confirmado, episódio → «pré-operatório», evento clínico na linha do tempo, notificação à equipa e auditoria.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Cirurgia"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 214,
                                        "numero": "CIR-2026-0214",
                                        "estado": "confirmada",
                                        "estado_rotulo": "Confirmada",
                                        "estado_tom": "sucesso",
                                        "paciente_id": 1204,
                                        "paciente_nome": "Rui Almeida",
                                        "episodio_id": 77,
                                        "proposta_id": 91,
                                        "plano_id": 318,
                                        "marcacao_id": 8902,
                                        "sala_id": 5,
                                        "sala_nome": "Bloco 1",
                                        "inicio_previsto": "2026-11-18T08:30:00+00:00",
                                        "fim_previsto": "2026-11-18T14:30:00+00:00",
                                        "tecnica": "FUE",
                                        "enxertos_planeados": 2850,
                                        "aptidao": "apto",
                                        "aptidao_rotulo": "Apto",
                                        "validada_por": "Inês Valente",
                                        "validada_em": "2026-10-28T11:05:00+00:00",
                                        "confirmada_em": "2026-10-29T09:30:00+00:00",
                                        "indicadores": [
                                            {
                                                "chave": "confirmada",
                                                "rotulo": "Confirmada",
                                                "ok": true
                                            },
                                            {
                                                "chave": "sinal",
                                                "rotulo": "Sinal pago",
                                                "ok": true
                                            },
                                            {
                                                "chave": "consentimento",
                                                "rotulo": "Consentimento",
                                                "ok": true
                                            },
                                            {
                                                "chave": "analises",
                                                "rotulo": "Análises",
                                                "ok": true
                                            },
                                            {
                                                "chave": "checklist",
                                                "rotulo": "Checklist",
                                                "ok": false
                                            }
                                        ],
                                        "equipa": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "valor_ato": 5900,
                                        "valores_visiveis": true,
                                        "enxertos_extraidos": null,
                                        "enxertos_implantados": null,
                                        "cabelos_total": null,
                                        "fechada_em": null,
                                        "motivo_cancelamento": null,
                                        "acoes": [
                                            "reservar",
                                            "equipa",
                                            "aptidao",
                                            "analises",
                                            "cancelar",
                                            "painel",
                                            "checklist"
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Só uma cirurgia validada pode ser confirmada."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Regra de negócio (consentimento_em_falta, aptidao_em_falta)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "consentimento_em_falta": {
                                        "summary": "consentimento_em_falta",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "consentimento_em_falta",
                                                "mensagem": "Sem consentimento cirúrgico válido.",
                                                "campos": {
                                                    "consentimento": "Sem consentimento cirúrgico válido."
                                                }
                                            }
                                        }
                                    },
                                    "aptidao_em_falta": {
                                        "summary": "aptidao_em_falta",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "aptidao_em_falta",
                                                "mensagem": "A aptidão pré-operatória tem de ser «apto».",
                                                "campos": {
                                                    "aptidao": "A aptidão pré-operatória tem de ser «apto»."
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/cirurgias/{id}/equipa": {
            "post": {
                "tags": [
                    "Mapa de cirurgias"
                ],
                "operationId": "m6EquipaCirurgia",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.marcar",
                "x-anagen-nivel": "editar",
                "summary": "Atribuir uma pessoa à equipa (ou mudar o papel)",
                "description": "Com a cirurgia já com data, verifica se a pessoa está ocupada ou ausente (409 «conflito»; avisos como «sem horário» aceitam-se com \"forcar\": true). Numa cirurgia validada ou confirmada devolve-a a «reservada» e avisa quem validou. Atualiza os participantes do bloco na agenda e notifica a pessoa (quando não é quem atribui). Efeitos: auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "utilizador_id": {
                                        "type": "integer"
                                    },
                                    "papel": {
                                        "type": "string",
                                        "enum": [
                                            "cirurgiao",
                                            "assistente",
                                            "enfermeiro",
                                            "tecnico",
                                            "anestesista"
                                        ]
                                    },
                                    "forcar": {
                                        "type": "boolean",
                                        "description": "Aceitar os avisos (conflito_aviso: feriado, fora do horário, sem horário, data passada). Nunca anula conflitos bloqueantes."
                                    }
                                },
                                "required": [
                                    "utilizador_id",
                                    "papel"
                                ]
                            },
                            "example": {
                                "utilizador_id": 19,
                                "papel": "enfermeiro"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Cirurgia"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 214,
                                        "numero": "CIR-2026-0214",
                                        "estado": "validada",
                                        "estado_rotulo": "Validada",
                                        "estado_tom": "info",
                                        "paciente_id": 1204,
                                        "paciente_nome": "Rui Almeida",
                                        "episodio_id": 77,
                                        "proposta_id": 91,
                                        "plano_id": 318,
                                        "marcacao_id": 8902,
                                        "sala_id": 5,
                                        "sala_nome": "Bloco 1",
                                        "inicio_previsto": "2026-11-18T08:30:00+00:00",
                                        "fim_previsto": "2026-11-18T14:30:00+00:00",
                                        "tecnica": "FUE",
                                        "enxertos_planeados": 2850,
                                        "aptidao": "apto",
                                        "aptidao_rotulo": "Apto",
                                        "validada_por": "Inês Valente",
                                        "validada_em": "2026-10-28T11:05:00+00:00",
                                        "confirmada_em": null,
                                        "indicadores": [
                                            {
                                                "chave": "confirmada",
                                                "rotulo": "Confirmada",
                                                "ok": false
                                            },
                                            {
                                                "chave": "sinal",
                                                "rotulo": "Sinal pago",
                                                "ok": true
                                            },
                                            {
                                                "chave": "consentimento",
                                                "rotulo": "Consentimento",
                                                "ok": true
                                            },
                                            {
                                                "chave": "analises",
                                                "rotulo": "Análises",
                                                "ok": true
                                            },
                                            {
                                                "chave": "checklist",
                                                "rotulo": "Checklist",
                                                "ok": false
                                            }
                                        ],
                                        "equipa": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "valor_ato": 5900,
                                        "valores_visiveis": true,
                                        "enxertos_extraidos": null,
                                        "enxertos_implantados": null,
                                        "cabelos_total": null,
                                        "fechada_em": null,
                                        "motivo_cancelamento": null,
                                        "acoes": [
                                            "reservar",
                                            "equipa",
                                            "aptidao",
                                            "confirmar",
                                            "analises",
                                            "cancelar",
                                            "checklist"
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (conflito, conflito_aviso, estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "conflito": {
                                        "summary": "conflito",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "conflito",
                                                "mensagem": "Há conflitos na agenda.",
                                                "campos": {
                                                    "participantes": "Marta Sousa já tem uma marcação das 09:00–13:00.",
                                                    "sala_id": "Bloco 1 está ocupada (a partir das 08:30)."
                                                }
                                            }
                                        }
                                    },
                                    "conflito_aviso": {
                                        "summary": "conflito_aviso",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "conflito_aviso",
                                                "mensagem": "Há avisos na agenda. Confirme para continuar.",
                                                "campos": {
                                                    "inicio": "A data já passou."
                                                }
                                            }
                                        }
                                    },
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Esta cirurgia já não pode ser mudada."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/cirurgias/{id}/reservar": {
            "post": {
                "tags": [
                    "Mapa de cirurgias"
                ],
                "operationId": "m6ReservarCirurgia",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.marcar",
                "x-anagen-nivel": "editar",
                "summary": "Reservar ou mudar o dia e a sala",
                "description": "Só em pré-marcada, reservada, validada ou confirmada (409 «estado_invalido»). Sem «fim», mantém a duração (ou a duração do tipo de cirurgia, 360 min por omissão). Conflitos verificados para o cirurgião, a equipa e a sala, sem horário de trabalho (409 «conflito» / «conflito_aviso»; reenvie com \"forcar\": true). Uma pré-marcada passa a reservada e o episódio a «agendado»; mudar o dia ou a sala de uma cirurgia validada ou confirmada devolve-a a «reservada» (nova validação) e avisa quem validou. Cria ou atualiza o bloco na agenda (marcação do tipo cirurgia, com a equipa como participantes) para que agenda e mapa partilhem os conflitos. Efeitos: histórico da marcação e auditoria. As horas da resposta vêm na hora local da clínica, sem fuso; o detalhe atualizado vem em «cirurgia».",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "inicio": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "fim": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date-time"
                                    },
                                    "sala_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "description": "Obrigatória se a cirurgia ainda não tem sala."
                                    },
                                    "forcar": {
                                        "type": "boolean",
                                        "description": "Aceitar os avisos (conflito_aviso: feriado, fora do horário, sem horário, data passada). Nunca anula conflitos bloqueantes."
                                    }
                                },
                                "required": [
                                    "inicio"
                                ]
                            },
                            "example": {
                                "inicio": "2026-11-18T08:30:00+00:00",
                                "sala_id": 5,
                                "forcar": false
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6ResultadoReserva"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 214,
                                        "inicio": "2026-11-18T08:30:00",
                                        "fim": "2026-11-18T14:30:00",
                                        "recurso": 5,
                                        "avisos": [],
                                        "mensagem": "Cirurgia reservada.",
                                        "cirurgia": {
                                            "id": 214,
                                            "numero": "CIR-2026-0214",
                                            "estado": "reservada",
                                            "estado_rotulo": "Reservada",
                                            "estado_tom": "ouro",
                                            "paciente_id": 1204,
                                            "paciente_nome": "Rui Almeida",
                                            "episodio_id": 77,
                                            "proposta_id": 91,
                                            "plano_id": 318,
                                            "marcacao_id": 8902,
                                            "sala_id": 5,
                                            "sala_nome": "Bloco 1",
                                            "inicio_previsto": "2026-11-18T08:30:00+00:00",
                                            "fim_previsto": "2026-11-18T14:30:00+00:00",
                                            "tecnica": "FUE",
                                            "enxertos_planeados": 2850,
                                            "aptidao": "apto",
                                            "aptidao_rotulo": "Apto",
                                            "validada_por": null,
                                            "validada_em": null,
                                            "confirmada_em": null,
                                            "indicadores": [
                                                {
                                                    "chave": "confirmada",
                                                    "rotulo": "Confirmada",
                                                    "ok": false
                                                },
                                                {
                                                    "chave": "sinal",
                                                    "rotulo": "Sinal pago",
                                                    "ok": true
                                                },
                                                {
                                                    "chave": "consentimento",
                                                    "rotulo": "Consentimento",
                                                    "ok": true
                                                },
                                                {
                                                    "chave": "analises",
                                                    "rotulo": "Análises",
                                                    "ok": true
                                                },
                                                {
                                                    "chave": "checklist",
                                                    "rotulo": "Checklist",
                                                    "ok": false
                                                }
                                            ],
                                            "equipa": [
                                                {
                                                    "utilizador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "cor": "#7A4E9C",
                                                    "papel": "cirurgiao",
                                                    "papel_rotulo": "Cirurgião",
                                                    "honorarios_valor": 1200
                                                },
                                                {
                                                    "utilizador_id": 15,
                                                    "nome": "Marta Sousa",
                                                    "cor": "#C0743A",
                                                    "papel": "assistente",
                                                    "papel_rotulo": "Assistente"
                                                },
                                                {
                                                    "utilizador_id": 19,
                                                    "nome": "Paulo Matos",
                                                    "cor": "#3A7BC0",
                                                    "papel": "enfermeiro",
                                                    "papel_rotulo": "Enfermeiro"
                                                }
                                            ],
                                            "valor_ato": 5900,
                                            "valores_visiveis": true,
                                            "enxertos_extraidos": null,
                                            "enxertos_implantados": null,
                                            "cabelos_total": null,
                                            "fechada_em": null,
                                            "motivo_cancelamento": null,
                                            "acoes": [
                                                "reservar",
                                                "equipa",
                                                "aptidao",
                                                "confirmar",
                                                "analises",
                                                "cancelar",
                                                "checklist"
                                            ],
                                            "checklists": [
                                                {
                                                    "id": 611,
                                                    "nome": "Verificação de segurança antes da cirurgia",
                                                    "fase": "pre_operatorio",
                                                    "fase_rotulo": "Pré-operatório",
                                                    "estado": "aberta",
                                                    "itens": [
                                                        {
                                                            "texto": "Identidade do paciente confirmada",
                                                            "responsavel_papel": "enfermeiro",
                                                            "obrigatorio": true,
                                                            "feito": true,
                                                            "feito_por": 19,
                                                            "feito_por_nome": "Paulo Matos",
                                                            "feito_em": "2026-11-17T16:20:00+00:00"
                                                        },
                                                        {
                                                            "texto": "Análises pré-operatórias revistas",
                                                            "responsavel_papel": "cirurgiao",
                                                            "obrigatorio": true,
                                                            "feito": false,
                                                            "feito_por": null,
                                                            "feito_por_nome": null,
                                                            "feito_em": null
                                                        },
                                                        {
                                                            "texto": "Fotografias pré-operatórias tiradas",
                                                            "responsavel_papel": "tecnico",
                                                            "obrigatorio": false,
                                                            "feito": false,
                                                            "feito_por": null,
                                                            "feito_por_nome": null,
                                                            "feito_em": null
                                                        }
                                                    ],
                                                    "feitos": 1,
                                                    "total": 3,
                                                    "concluida_em": null
                                                }
                                            ]
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (conflito, conflito_aviso, estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "conflito": {
                                        "summary": "conflito",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "conflito",
                                                "mensagem": "Há conflitos na agenda.",
                                                "campos": {
                                                    "participantes": "Marta Sousa já tem uma marcação das 09:00–13:00.",
                                                    "sala_id": "Bloco 1 está ocupada (a partir das 08:30)."
                                                }
                                            }
                                        }
                                    },
                                    "conflito_aviso": {
                                        "summary": "conflito_aviso",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "conflito_aviso",
                                                "mensagem": "Há avisos na agenda. Confirme para continuar.",
                                                "campos": {
                                                    "inicio": "A data já passou."
                                                }
                                            }
                                        }
                                    },
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Esta cirurgia já não pode ser mudada."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/cirurgias/{id}/retirar": {
            "post": {
                "tags": [
                    "Mapa de cirurgias"
                ],
                "operationId": "m6RetirarDaEquipa",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.marcar",
                "x-anagen-nivel": "editar",
                "summary": "Retirar uma pessoa da equipa",
                "description": "Só em estados planeáveis (409). Numa cirurgia validada ou confirmada devolve-a a «reservada» e avisa quem validou. Atualiza o bloco na agenda. Efeitos: auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "utilizador_id": {
                                        "type": "integer"
                                    }
                                },
                                "required": [
                                    "utilizador_id"
                                ]
                            },
                            "example": {
                                "utilizador_id": 19
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Cirurgia"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 214,
                                        "numero": "CIR-2026-0214",
                                        "estado": "validada",
                                        "estado_rotulo": "Validada",
                                        "estado_tom": "info",
                                        "paciente_id": 1204,
                                        "paciente_nome": "Rui Almeida",
                                        "episodio_id": 77,
                                        "proposta_id": 91,
                                        "plano_id": 318,
                                        "marcacao_id": 8902,
                                        "sala_id": 5,
                                        "sala_nome": "Bloco 1",
                                        "inicio_previsto": "2026-11-18T08:30:00+00:00",
                                        "fim_previsto": "2026-11-18T14:30:00+00:00",
                                        "tecnica": "FUE",
                                        "enxertos_planeados": 2850,
                                        "aptidao": "apto",
                                        "aptidao_rotulo": "Apto",
                                        "validada_por": "Inês Valente",
                                        "validada_em": "2026-10-28T11:05:00+00:00",
                                        "confirmada_em": null,
                                        "indicadores": [
                                            {
                                                "chave": "confirmada",
                                                "rotulo": "Confirmada",
                                                "ok": false
                                            },
                                            {
                                                "chave": "sinal",
                                                "rotulo": "Sinal pago",
                                                "ok": true
                                            },
                                            {
                                                "chave": "consentimento",
                                                "rotulo": "Consentimento",
                                                "ok": true
                                            },
                                            {
                                                "chave": "analises",
                                                "rotulo": "Análises",
                                                "ok": true
                                            },
                                            {
                                                "chave": "checklist",
                                                "rotulo": "Checklist",
                                                "ok": false
                                            }
                                        ],
                                        "equipa": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "valor_ato": 5900,
                                        "valores_visiveis": true,
                                        "enxertos_extraidos": null,
                                        "enxertos_implantados": null,
                                        "cabelos_total": null,
                                        "fechada_em": null,
                                        "motivo_cancelamento": null,
                                        "acoes": [
                                            "reservar",
                                            "equipa",
                                            "aptidao",
                                            "confirmar",
                                            "analises",
                                            "cancelar",
                                            "checklist"
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Esta cirurgia já não pode ser mudada."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/cirurgias/{id}/validar": {
            "post": {
                "tags": [
                    "Mapa de cirurgias"
                ],
                "operationId": "m6ValidarCirurgia",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.marcar",
                "x-anagen-nivel": "aprovar",
                "summary": "Validar a equipa e a aptidão (médico)",
                "description": "Exige «aprovar» em «bloco.marcar». Só a partir de «reservada» (409). Exige data e sala, cirurgião na equipa e aptidão «apto» (422 «validacao» com os campos inicio, equipa, aptidao). Efeitos: auditoria «aprovar» e notificação a quem reservou.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Cirurgia"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 214,
                                        "numero": "CIR-2026-0214",
                                        "estado": "validada",
                                        "estado_rotulo": "Validada",
                                        "estado_tom": "info",
                                        "paciente_id": 1204,
                                        "paciente_nome": "Rui Almeida",
                                        "episodio_id": 77,
                                        "proposta_id": 91,
                                        "plano_id": 318,
                                        "marcacao_id": 8902,
                                        "sala_id": 5,
                                        "sala_nome": "Bloco 1",
                                        "inicio_previsto": "2026-11-18T08:30:00+00:00",
                                        "fim_previsto": "2026-11-18T14:30:00+00:00",
                                        "tecnica": "FUE",
                                        "enxertos_planeados": 2850,
                                        "aptidao": "apto",
                                        "aptidao_rotulo": "Apto",
                                        "validada_por": "Inês Valente",
                                        "validada_em": "2026-10-28T11:05:00+00:00",
                                        "confirmada_em": null,
                                        "indicadores": [
                                            {
                                                "chave": "confirmada",
                                                "rotulo": "Confirmada",
                                                "ok": false
                                            },
                                            {
                                                "chave": "sinal",
                                                "rotulo": "Sinal pago",
                                                "ok": true
                                            },
                                            {
                                                "chave": "consentimento",
                                                "rotulo": "Consentimento",
                                                "ok": true
                                            },
                                            {
                                                "chave": "analises",
                                                "rotulo": "Análises",
                                                "ok": true
                                            },
                                            {
                                                "chave": "checklist",
                                                "rotulo": "Checklist",
                                                "ok": false
                                            }
                                        ],
                                        "equipa": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "valor_ato": 5900,
                                        "valores_visiveis": true,
                                        "enxertos_extraidos": null,
                                        "enxertos_implantados": null,
                                        "cabelos_total": null,
                                        "fechada_em": null,
                                        "motivo_cancelamento": null,
                                        "acoes": [
                                            "reservar",
                                            "equipa",
                                            "aptidao",
                                            "confirmar",
                                            "analises",
                                            "cancelar",
                                            "checklist"
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Só uma cirurgia reservada pode ser validada."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Regra de negócio (validacao)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "validacao": {
                                        "summary": "validacao",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "validacao",
                                                "mensagem": "Ainda não é possível validar.",
                                                "campos": {
                                                    "equipa": "Falta o cirurgião na equipa.",
                                                    "aptidao": "A aptidão pré-operatória tem de ser «apto»."
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/escala": {
            "get": {
                "tags": [
                    "Mapa de cirurgias"
                ],
                "operationId": "m6EscalaBloco",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "bloco.mapa",
                "x-anagen-nivel": "ver",
                "summary": "Escala semanal da equipa clínica",
                "description": "Semana (segunda a domingo) que contém «data»: uma linha por pessoa da equipa clínica (médicos, enfermagem, técnicos) com as cirurgias de cada dia (hora, sala, papel, estado) e as ausências aprovadas. Quem tem cirurgias na semana aparece primeiro.",
                "parameters": [
                    {
                        "name": "data",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Qualquer dia da semana pretendida (por omissão hoje)."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Escala"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "dias": [
                                            "2026-11-16",
                                            "2026-11-17",
                                            "2026-11-18",
                                            "2026-11-19",
                                            "2026-11-20",
                                            "2026-11-21",
                                            "2026-11-22"
                                        ],
                                        "linhas": [
                                            {
                                                "utilizador": {
                                                    "id": 7,
                                                    "nome": "Inês Valente",
                                                    "cor": "#7A4E9C",
                                                    "perfil": "medico",
                                                    "departamento": "medico"
                                                },
                                                "dias": [
                                                    {
                                                        "data": "2026-11-16",
                                                        "itens": [],
                                                        "ausencia": null
                                                    },
                                                    {
                                                        "data": "2026-11-17",
                                                        "itens": [],
                                                        "ausencia": null
                                                    },
                                                    {
                                                        "data": "2026-11-18",
                                                        "itens": [
                                                            {
                                                                "cirurgia_id": 214,
                                                                "numero": "CIR-2026-0214",
                                                                "hora": "08:30–14:30",
                                                                "sala": "Bloco 1",
                                                                "papel": "Cirurgião",
                                                                "estado": "validada"
                                                            }
                                                        ],
                                                        "ausencia": null
                                                    },
                                                    {
                                                        "data": "2026-11-19",
                                                        "itens": [],
                                                        "ausencia": null
                                                    },
                                                    {
                                                        "data": "2026-11-20",
                                                        "itens": [],
                                                        "ausencia": "Formação"
                                                    },
                                                    {
                                                        "data": "2026-11-21",
                                                        "itens": [],
                                                        "ausencia": null
                                                    },
                                                    {
                                                        "data": "2026-11-22",
                                                        "itens": [],
                                                        "ausencia": null
                                                    }
                                                ],
                                                "total": 1
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/mapa": {
            "get": {
                "tags": [
                    "Mapa de cirurgias"
                ],
                "operationId": "m6MapaCirurgias",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "bloco.mapa",
                "x-anagen-nivel": "ver",
                "summary": "Mapa de cirurgias por sala",
                "description": "Cirurgias não canceladas com data no intervalo (até 500), com a cor do cirurgião, a sala como «recurso», os 5 indicadores (confirmada, sinal, consentimento, análises, checklist) e a equipa. «utilizador» mostra só as cirurgias em que a pessoa está na equipa. «editavel» indica se quem pede pode mudar a cirurgia (bloco.marcar editar e estado planeável).",
                "parameters": [
                    {
                        "name": "inicio",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Início (por omissão hoje)."
                    },
                    {
                        "name": "fim",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Fim (por omissão hoje + 7 dias)."
                    },
                    {
                        "name": "utilizador",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Só cirurgias com esta pessoa na equipa."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/M6EventoMapa"
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "total": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 214,
                                            "titulo": "CIR-2026-0214 · Rui Almeida",
                                            "subtitulo": "Validada · 3/5 · Inês V., Marta S., Paulo M.",
                                            "inicio": "2026-11-18T08:30:00+00:00",
                                            "fim": "2026-11-18T14:30:00+00:00",
                                            "cor": "#7A4E9C",
                                            "recurso": 5,
                                            "url": null,
                                            "editavel": true,
                                            "numero": "CIR-2026-0214",
                                            "estado": "validada",
                                            "estado_rotulo": "Validada",
                                            "estado_tom": "info",
                                            "paciente_id": 1204,
                                            "paciente_nome": "Rui Almeida",
                                            "sala_id": 5,
                                            "tecnica": "FUE",
                                            "enxertos_planeados": 2850,
                                            "indicadores": [
                                                {
                                                    "chave": "confirmada",
                                                    "rotulo": "Confirmada",
                                                    "ok": false
                                                },
                                                {
                                                    "chave": "sinal",
                                                    "rotulo": "Sinal pago",
                                                    "ok": true
                                                },
                                                {
                                                    "chave": "consentimento",
                                                    "rotulo": "Consentimento",
                                                    "ok": true
                                                },
                                                {
                                                    "chave": "analises",
                                                    "rotulo": "Análises",
                                                    "ok": true
                                                },
                                                {
                                                    "chave": "checklist",
                                                    "rotulo": "Checklist",
                                                    "ok": false
                                                }
                                            ],
                                            "indicadores_ok": 3,
                                            "equipa": [
                                                {
                                                    "utilizador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "cor": "#7A4E9C",
                                                    "papel": "cirurgiao"
                                                },
                                                {
                                                    "utilizador_id": 15,
                                                    "nome": "Marta Sousa",
                                                    "cor": "#C0743A",
                                                    "papel": "assistente"
                                                }
                                            ]
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/ocupacao": {
            "get": {
                "tags": [
                    "Mapa de cirurgias"
                ],
                "operationId": "m6OcupacaoBloco",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "bloco.mapa",
                "x-anagen-nivel": "ver",
                "summary": "Ocupação do bloco por sala",
                "description": "Salas de bloco (ou todas as salas, se nenhuma estiver marcada como bloco): horas disponíveis pelos horários da sala (sem horário: Definições › Bloco › horas por dia útil, 10 por omissão), horas usadas por cirurgias reservadas ou seguintes, percentagem e número de cirurgias. Por omissão a semana corrente.",
                "parameters": [
                    {
                        "name": "inicio",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Início (por omissão segunda-feira desta semana)."
                    },
                    {
                        "name": "fim",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Fim (por omissão início + 7 dias)."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/M6OcupacaoBloco"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "sala_id": 5,
                                            "sala_nome": "Bloco 1",
                                            "cor": "#8C2F39",
                                            "horas_disponiveis": 50,
                                            "horas_usadas": 36,
                                            "percentagem": 72,
                                            "cirurgias": 6
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/painel": {
            "get": {
                "tags": [
                    "Painel cirúrgico"
                ],
                "operationId": "m6PainelDoDia",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "ver",
                "summary": "Cirurgias do dia para escolher no painel",
                "description": "Cirurgias validadas, confirmadas, em curso ou concluídas com início previsto no dia, por hora, com a fase atual e a equipa.",
                "parameters": [
                    {
                        "name": "data",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Dia (por omissão hoje)."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/M6CirurgiaDoDia"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 214,
                                            "numero": "CIR-2026-0214",
                                            "paciente_nome": "Rui Almeida",
                                            "inicio": "2026-11-18T08:30:00+00:00",
                                            "sala_nome": "Bloco 1",
                                            "estado": "em_curso",
                                            "estado_rotulo": "Em curso",
                                            "estado_tom": "marca",
                                            "fase_atual": "implantacao",
                                            "enxertos_planeados": 2850,
                                            "tecnica": "FUE",
                                            "equipa": [
                                                {
                                                    "utilizador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "cor": "#7A4E9C",
                                                    "papel": "cirurgiao",
                                                    "papel_rotulo": "Cirurgião"
                                                }
                                            ]
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/painel/{id}": {
            "get": {
                "tags": [
                    "Painel cirúrgico"
                ],
                "operationId": "m6PainelEstado",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "ver",
                "summary": "Estado completo do painel",
                "description": "Estado sincronizado entre os tablets do bloco (consultar a cada poucos segundos): cirurgia e cronómetro (sem as pausas), fases com duração, equipa e operadores, contagens por tipo de UF e momento, progresso face ao planeado, lotes com tempo fora do corpo (alerta e máximo em Definições › Bloco, 4 h e 6 h por omissão), transecção, resumo do plano aprovado (com «ficha.plano» resumo), enfermagem (só com acesso à ficha clínica; senão {visivel:false}), checklists, alta, permissões e palavras da contagem por voz. A primeira leitura sem «atualizar» regista a abertura do painel na auditoria; as atualizações periódicas devem enviar atualizar=1.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "name": "atualizar",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "enum": [
                                1
                            ]
                        },
                        "description": "Atualização periódica (não regista nova abertura na auditoria)."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Painel"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "cirurgia": {
                                            "id": 214,
                                            "numero": "CIR-2026-0214",
                                            "estado": "em_curso",
                                            "estado_rotulo": "Em curso",
                                            "estado_tom": "marca",
                                            "paciente_id": 1204,
                                            "paciente_nome": "Rui Almeida",
                                            "sala_nome": "Bloco 1",
                                            "tecnica": "FUE",
                                            "inicio_previsto": "2026-11-18T08:30:00+00:00",
                                            "inicio_real": "2026-11-18T08:41:00+00:00",
                                            "fim_real": null,
                                            "fase_atual": "implantacao",
                                            "pausada": false,
                                            "pausada_em": null,
                                            "decorrido_seg": 14100,
                                            "peso_kg": 80,
                                            "consentimento": true
                                        },
                                        "fases": [
                                            {
                                                "fase": "admissao",
                                                "rotulo": "Admissão",
                                                "duracao_seg": 900,
                                                "inicio": "2026-11-18T08:41:00+00:00",
                                                "fim": "2026-11-18T08:56:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "desenho",
                                                "rotulo": "Desenho",
                                                "duracao_seg": 1200,
                                                "inicio": "2026-11-18T08:56:00+00:00",
                                                "fim": "2026-11-18T09:16:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "anestesia",
                                                "rotulo": "Anestesia",
                                                "duracao_seg": 600,
                                                "inicio": "2026-11-18T09:16:00+00:00",
                                                "fim": "2026-11-18T09:26:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "extracao",
                                                "rotulo": "Extração",
                                                "duracao_seg": 6900,
                                                "inicio": "2026-11-18T09:26:00+00:00",
                                                "fim": "2026-11-18T11:26:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "implantacao",
                                                "rotulo": "Implantação",
                                                "duracao_seg": 4500,
                                                "inicio": "2026-11-18T11:26:00+00:00",
                                                "fim": null,
                                                "atual": true,
                                                "feita": false
                                            },
                                            {
                                                "fase": "penso",
                                                "rotulo": "Penso",
                                                "duracao_seg": 0,
                                                "inicio": null,
                                                "fim": null,
                                                "atual": false,
                                                "feita": false
                                            },
                                            {
                                                "fase": "alta",
                                                "rotulo": "Alta",
                                                "duracao_seg": 0,
                                                "inicio": null,
                                                "fim": null,
                                                "atual": false,
                                                "feita": false
                                            }
                                        ],
                                        "equipa": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "operadores": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "contagens": {
                                            "extracao": {
                                                "por_tipo": {
                                                    "1": 410,
                                                    "2": 1260,
                                                    "3": 820,
                                                    "4": 140
                                                },
                                                "total": 2630,
                                                "cabelos": 5950,
                                                "cabelos_por_enxerto": 2.26
                                            },
                                            "implantacao": {
                                                "por_tipo": {
                                                    "1": 380,
                                                    "2": 1100,
                                                    "3": 700,
                                                    "4": 120
                                                },
                                                "total": 2300,
                                                "cabelos": 5160,
                                                "cabelos_por_enxerto": 2.24
                                            },
                                            "por_operador": [
                                                {
                                                    "operador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "cor": "#7A4E9C",
                                                    "extracao": 2630,
                                                    "implantacao": 0,
                                                    "por_tipo": {
                                                        "1": 410,
                                                        "2": 1260,
                                                        "3": 820,
                                                        "4": 140
                                                    },
                                                    "por_hora": 780
                                                },
                                                {
                                                    "operador_id": 15,
                                                    "nome": "Marta Sousa",
                                                    "cor": "#C0743A",
                                                    "extracao": 0,
                                                    "implantacao": 2300,
                                                    "por_tipo": {
                                                        "1": 380,
                                                        "2": 1100,
                                                        "3": 700,
                                                        "4": 120
                                                    },
                                                    "por_hora": 920
                                                }
                                            ]
                                        },
                                        "planeado": 2850,
                                        "progresso": {
                                            "extraido_pct": 92,
                                            "implantado_pct": 81
                                        },
                                        "ultima_contagem": {
                                            "id": 90412,
                                            "tipo_uf": 2,
                                            "momento": "implantacao",
                                            "operador": "Marta Sousa",
                                            "criado_em": "2026-11-18T12:41:09+00:00"
                                        },
                                        "lotes": [
                                            {
                                                "id": 51,
                                                "lote": "L1",
                                                "quantidade": 600,
                                                "operador": "Inês Valente",
                                                "extraido_em": "2026-11-18T09:50:00+00:00",
                                                "implantado_em": "2026-11-18T11:35:00+00:00",
                                                "horas_fora": 1.75,
                                                "estado": "ok"
                                            },
                                            {
                                                "id": 52,
                                                "lote": "L2",
                                                "quantidade": 700,
                                                "operador": "Inês Valente",
                                                "extraido_em": "2026-11-18T10:30:00+00:00",
                                                "implantado_em": null,
                                                "horas_fora": 2.18,
                                                "estado": "ok"
                                            }
                                        ],
                                        "tempo_fora": {
                                            "alerta_h": 4,
                                            "maximo_h": 6
                                        },
                                        "transeccao": {
                                            "sessao_pct": 3.5,
                                            "amostras": 2,
                                            "observados": 200,
                                            "por_operador": [
                                                {
                                                    "operador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "pct": 3.5,
                                                    "observados": 200
                                                }
                                            ]
                                        },
                                        "plano": {
                                            "id": 318,
                                            "versao": 3,
                                            "tecnica": "FUE",
                                            "enxertos_necessarios": 3200,
                                            "capacidade_sessao": 2850,
                                            "zonas": [
                                                {
                                                    "zona": "linha_frontal",
                                                    "rotulo": "Linha frontal",
                                                    "area_cm2": 15,
                                                    "densidade_alvo": 25,
                                                    "enxertos": 375
                                                },
                                                {
                                                    "zona": "frontal",
                                                    "rotulo": "Frontal",
                                                    "area_cm2": 60,
                                                    "densidade_alvo": 30,
                                                    "enxertos": 1800
                                                }
                                            ]
                                        },
                                        "enfermagem": {
                                            "visivel": true,
                                            "registos": [
                                                {
                                                    "id": 3302,
                                                    "tipo": "sinais_vitais",
                                                    "tipo_rotulo": "Sinais vitais",
                                                    "dados": {
                                                        "tas": 128,
                                                        "tad": 79,
                                                        "fc": 72,
                                                        "spo2": 98
                                                    },
                                                    "texto": "TA 128/79 mmHg · FC 72 bpm · SpO₂ 98 %",
                                                    "autor": "Paulo Matos",
                                                    "registado_em": "2026-11-18T10:00:00+00:00",
                                                    "anulado": false,
                                                    "motivo_anulacao": null
                                                },
                                                {
                                                    "id": 3301,
                                                    "tipo": "farmaco",
                                                    "tipo_rotulo": "Fármaco",
                                                    "dados": {
                                                        "nome": "Lidocaína com adrenalina",
                                                        "dose": 34,
                                                        "unidade": "ml",
                                                        "concentracao_pct": 1,
                                                        "via": "local",
                                                        "hora": "09:05",
                                                        "lote": "LX2291",
                                                        "adrenalina": true,
                                                        "artigo_id": 58
                                                    },
                                                    "texto": "Lidocaína com adrenalina 34,00 ml (1,0 %) · Local · 09:05 · Lote LX2291 · com adrenalina",
                                                    "autor": "Paulo Matos",
                                                    "registado_em": "2026-11-18T09:05:00+00:00",
                                                    "anulado": false,
                                                    "motivo_anulacao": null
                                                }
                                            ],
                                            "lidocaina": {
                                                "mg_total": 340,
                                                "mg_kg": 4.25,
                                                "limite": 7,
                                                "com_adrenalina": true,
                                                "aviso_pct": 80,
                                                "percentagem": 61,
                                                "estado": "ok",
                                                "peso_kg": 80
                                            },
                                            "sinais_vitais": {
                                                "ultimo_em": "2026-11-18T10:00:00+00:00",
                                                "intervalo_min": 60,
                                                "em_atraso": false
                                            },
                                            "dor_ultima": 2,
                                            "vias": [
                                                {
                                                    "valor": "local",
                                                    "rotulo": "Local"
                                                },
                                                {
                                                    "valor": "subcutanea",
                                                    "rotulo": "Subcutânea"
                                                },
                                                {
                                                    "valor": "oral",
                                                    "rotulo": "Oral"
                                                }
                                            ],
                                            "unidades": [
                                                "mg",
                                                "ml",
                                                "mcg",
                                                "UI",
                                                "g"
                                            ]
                                        },
                                        "checklists": [
                                            {
                                                "id": 611,
                                                "nome": "Verificação de segurança antes da cirurgia",
                                                "fase": "pre_operatorio",
                                                "fase_rotulo": "Pré-operatório",
                                                "estado": "concluida",
                                                "itens": [
                                                    {
                                                        "texto": "Identidade do paciente confirmada",
                                                        "responsavel_papel": "enfermeiro",
                                                        "obrigatorio": true,
                                                        "feito": true,
                                                        "feito_por": 19,
                                                        "feito_por_nome": "Paulo Matos",
                                                        "feito_em": "2026-11-17T16:20:00+00:00"
                                                    },
                                                    {
                                                        "texto": "Análises pré-operatórias revistas",
                                                        "responsavel_papel": "cirurgiao",
                                                        "obrigatorio": true,
                                                        "feito": false,
                                                        "feito_por": null,
                                                        "feito_por_nome": null,
                                                        "feito_em": null
                                                    },
                                                    {
                                                        "texto": "Fotografias pré-operatórias tiradas",
                                                        "responsavel_papel": "tecnico",
                                                        "obrigatorio": false,
                                                        "feito": false,
                                                        "feito_por": null,
                                                        "feito_por_nome": null,
                                                        "feito_em": null
                                                    }
                                                ],
                                                "feitos": 3,
                                                "total": 3,
                                                "concluida_em": "2026-11-18T08:20:00+00:00"
                                            }
                                        ],
                                        "alta": null,
                                        "permissoes": {
                                            "registar": true,
                                            "abrir": false,
                                            "fechar": true,
                                            "enfermagem": true
                                        },
                                        "voz_palavras": {
                                            "1": [
                                                "um",
                                                "uma",
                                                "one",
                                                "uno",
                                                "un",
                                                "eins",
                                                "1"
                                            ],
                                            "2": [
                                                "dois",
                                                "duas",
                                                "two",
                                                "dos",
                                                "deux",
                                                "zwei",
                                                "2"
                                            ],
                                            "3": [
                                                "três",
                                                "tres",
                                                "three",
                                                "trois",
                                                "drei",
                                                "3"
                                            ],
                                            "4": [
                                                "quatro",
                                                "four",
                                                "cuatro",
                                                "quatre",
                                                "vier",
                                                "4"
                                            ],
                                            "desfazer": [
                                                "desfazer",
                                                "anular",
                                                "undo",
                                                "deshacer",
                                                "annuler",
                                                "rückgängig"
                                            ]
                                        },
                                        "atualizado_em": "2026-11-18T12:41:12+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/painel/{id}/abrir": {
            "post": {
                "tags": [
                    "Painel cirúrgico"
                ],
                "operationId": "m6PainelAbrir",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "summary": "Abrir a sessão cirúrgica",
                "description": "Só uma cirurgia confirmada (409 «estado_invalido») e só com o consentimento cirúrgico válido, verificado de novo neste momento (422 «consentimento_em_falta»). Efeitos: cirurgia em curso com hora de início real e fase «admissão», checklists da admissão criadas, marcação em curso com check-in, episódio → «cirurgia», evento clínico na linha do tempo e auditoria.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Painel"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "cirurgia": {
                                            "id": 214,
                                            "numero": "CIR-2026-0214",
                                            "estado": "em_curso",
                                            "estado_rotulo": "Em curso",
                                            "estado_tom": "marca",
                                            "paciente_id": 1204,
                                            "paciente_nome": "Rui Almeida",
                                            "sala_nome": "Bloco 1",
                                            "tecnica": "FUE",
                                            "inicio_previsto": "2026-11-18T08:30:00+00:00",
                                            "inicio_real": "2026-11-18T08:41:00+00:00",
                                            "fim_real": null,
                                            "fase_atual": "implantacao",
                                            "pausada": false,
                                            "pausada_em": null,
                                            "decorrido_seg": 14100,
                                            "peso_kg": 80,
                                            "consentimento": true
                                        },
                                        "fases": [
                                            {
                                                "fase": "admissao",
                                                "rotulo": "Admissão",
                                                "duracao_seg": 900,
                                                "inicio": "2026-11-18T08:41:00+00:00",
                                                "fim": "2026-11-18T08:56:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "desenho",
                                                "rotulo": "Desenho",
                                                "duracao_seg": 1200,
                                                "inicio": "2026-11-18T08:56:00+00:00",
                                                "fim": "2026-11-18T09:16:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "anestesia",
                                                "rotulo": "Anestesia",
                                                "duracao_seg": 600,
                                                "inicio": "2026-11-18T09:16:00+00:00",
                                                "fim": "2026-11-18T09:26:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "extracao",
                                                "rotulo": "Extração",
                                                "duracao_seg": 6900,
                                                "inicio": "2026-11-18T09:26:00+00:00",
                                                "fim": "2026-11-18T11:26:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "implantacao",
                                                "rotulo": "Implantação",
                                                "duracao_seg": 4500,
                                                "inicio": "2026-11-18T11:26:00+00:00",
                                                "fim": null,
                                                "atual": true,
                                                "feita": false
                                            },
                                            {
                                                "fase": "penso",
                                                "rotulo": "Penso",
                                                "duracao_seg": 0,
                                                "inicio": null,
                                                "fim": null,
                                                "atual": false,
                                                "feita": false
                                            },
                                            {
                                                "fase": "alta",
                                                "rotulo": "Alta",
                                                "duracao_seg": 0,
                                                "inicio": null,
                                                "fim": null,
                                                "atual": false,
                                                "feita": false
                                            }
                                        ],
                                        "equipa": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "operadores": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "contagens": {
                                            "extracao": {
                                                "por_tipo": {
                                                    "1": 410,
                                                    "2": 1260,
                                                    "3": 820,
                                                    "4": 140
                                                },
                                                "total": 2630,
                                                "cabelos": 5950,
                                                "cabelos_por_enxerto": 2.26
                                            },
                                            "implantacao": {
                                                "por_tipo": {
                                                    "1": 380,
                                                    "2": 1100,
                                                    "3": 700,
                                                    "4": 120
                                                },
                                                "total": 2300,
                                                "cabelos": 5160,
                                                "cabelos_por_enxerto": 2.24
                                            },
                                            "por_operador": [
                                                {
                                                    "operador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "cor": "#7A4E9C",
                                                    "extracao": 2630,
                                                    "implantacao": 0,
                                                    "por_tipo": {
                                                        "1": 410,
                                                        "2": 1260,
                                                        "3": 820,
                                                        "4": 140
                                                    },
                                                    "por_hora": 780
                                                },
                                                {
                                                    "operador_id": 15,
                                                    "nome": "Marta Sousa",
                                                    "cor": "#C0743A",
                                                    "extracao": 0,
                                                    "implantacao": 2300,
                                                    "por_tipo": {
                                                        "1": 380,
                                                        "2": 1100,
                                                        "3": 700,
                                                        "4": 120
                                                    },
                                                    "por_hora": 920
                                                }
                                            ]
                                        },
                                        "planeado": 2850,
                                        "progresso": {
                                            "extraido_pct": 92,
                                            "implantado_pct": 81
                                        },
                                        "ultima_contagem": {
                                            "id": 90412,
                                            "tipo_uf": 2,
                                            "momento": "implantacao",
                                            "operador": "Marta Sousa",
                                            "criado_em": "2026-11-18T12:41:09+00:00"
                                        },
                                        "lotes": [
                                            {
                                                "id": 51,
                                                "lote": "L1",
                                                "quantidade": 600,
                                                "operador": "Inês Valente",
                                                "extraido_em": "2026-11-18T09:50:00+00:00",
                                                "implantado_em": "2026-11-18T11:35:00+00:00",
                                                "horas_fora": 1.75,
                                                "estado": "ok"
                                            },
                                            {
                                                "id": 52,
                                                "lote": "L2",
                                                "quantidade": 700,
                                                "operador": "Inês Valente",
                                                "extraido_em": "2026-11-18T10:30:00+00:00",
                                                "implantado_em": null,
                                                "horas_fora": 2.18,
                                                "estado": "ok"
                                            }
                                        ],
                                        "tempo_fora": {
                                            "alerta_h": 4,
                                            "maximo_h": 6
                                        },
                                        "transeccao": {
                                            "sessao_pct": 3.5,
                                            "amostras": 2,
                                            "observados": 200,
                                            "por_operador": [
                                                {
                                                    "operador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "pct": 3.5,
                                                    "observados": 200
                                                }
                                            ]
                                        },
                                        "plano": {
                                            "id": 318,
                                            "versao": 3,
                                            "tecnica": "FUE",
                                            "enxertos_necessarios": 3200,
                                            "capacidade_sessao": 2850,
                                            "zonas": [
                                                {
                                                    "zona": "linha_frontal",
                                                    "rotulo": "Linha frontal",
                                                    "area_cm2": 15,
                                                    "densidade_alvo": 25,
                                                    "enxertos": 375
                                                },
                                                {
                                                    "zona": "frontal",
                                                    "rotulo": "Frontal",
                                                    "area_cm2": 60,
                                                    "densidade_alvo": 30,
                                                    "enxertos": 1800
                                                }
                                            ]
                                        },
                                        "enfermagem": {
                                            "visivel": true,
                                            "registos": [
                                                {
                                                    "id": 3302,
                                                    "tipo": "sinais_vitais",
                                                    "tipo_rotulo": "Sinais vitais",
                                                    "dados": {
                                                        "tas": 128,
                                                        "tad": 79,
                                                        "fc": 72,
                                                        "spo2": 98
                                                    },
                                                    "texto": "TA 128/79 mmHg · FC 72 bpm · SpO₂ 98 %",
                                                    "autor": "Paulo Matos",
                                                    "registado_em": "2026-11-18T10:00:00+00:00",
                                                    "anulado": false,
                                                    "motivo_anulacao": null
                                                },
                                                {
                                                    "id": 3301,
                                                    "tipo": "farmaco",
                                                    "tipo_rotulo": "Fármaco",
                                                    "dados": {
                                                        "nome": "Lidocaína com adrenalina",
                                                        "dose": 34,
                                                        "unidade": "ml",
                                                        "concentracao_pct": 1,
                                                        "via": "local",
                                                        "hora": "09:05",
                                                        "lote": "LX2291",
                                                        "adrenalina": true,
                                                        "artigo_id": 58
                                                    },
                                                    "texto": "Lidocaína com adrenalina 34,00 ml (1,0 %) · Local · 09:05 · Lote LX2291 · com adrenalina",
                                                    "autor": "Paulo Matos",
                                                    "registado_em": "2026-11-18T09:05:00+00:00",
                                                    "anulado": false,
                                                    "motivo_anulacao": null
                                                }
                                            ],
                                            "lidocaina": {
                                                "mg_total": 340,
                                                "mg_kg": 4.25,
                                                "limite": 7,
                                                "com_adrenalina": true,
                                                "aviso_pct": 80,
                                                "percentagem": 61,
                                                "estado": "ok",
                                                "peso_kg": 80
                                            },
                                            "sinais_vitais": {
                                                "ultimo_em": "2026-11-18T10:00:00+00:00",
                                                "intervalo_min": 60,
                                                "em_atraso": false
                                            },
                                            "dor_ultima": 2,
                                            "vias": [
                                                {
                                                    "valor": "local",
                                                    "rotulo": "Local"
                                                },
                                                {
                                                    "valor": "subcutanea",
                                                    "rotulo": "Subcutânea"
                                                },
                                                {
                                                    "valor": "oral",
                                                    "rotulo": "Oral"
                                                }
                                            ],
                                            "unidades": [
                                                "mg",
                                                "ml",
                                                "mcg",
                                                "UI",
                                                "g"
                                            ]
                                        },
                                        "checklists": [
                                            {
                                                "id": 611,
                                                "nome": "Verificação de segurança antes da cirurgia",
                                                "fase": "pre_operatorio",
                                                "fase_rotulo": "Pré-operatório",
                                                "estado": "concluida",
                                                "itens": [
                                                    {
                                                        "texto": "Identidade do paciente confirmada",
                                                        "responsavel_papel": "enfermeiro",
                                                        "obrigatorio": true,
                                                        "feito": true,
                                                        "feito_por": 19,
                                                        "feito_por_nome": "Paulo Matos",
                                                        "feito_em": "2026-11-17T16:20:00+00:00"
                                                    },
                                                    {
                                                        "texto": "Análises pré-operatórias revistas",
                                                        "responsavel_papel": "cirurgiao",
                                                        "obrigatorio": true,
                                                        "feito": false,
                                                        "feito_por": null,
                                                        "feito_por_nome": null,
                                                        "feito_em": null
                                                    },
                                                    {
                                                        "texto": "Fotografias pré-operatórias tiradas",
                                                        "responsavel_papel": "tecnico",
                                                        "obrigatorio": false,
                                                        "feito": false,
                                                        "feito_por": null,
                                                        "feito_por_nome": null,
                                                        "feito_em": null
                                                    }
                                                ],
                                                "feitos": 3,
                                                "total": 3,
                                                "concluida_em": "2026-11-18T08:20:00+00:00"
                                            }
                                        ],
                                        "alta": null,
                                        "permissoes": {
                                            "registar": true,
                                            "abrir": false,
                                            "fechar": true,
                                            "enfermagem": true
                                        },
                                        "voz_palavras": {
                                            "1": [
                                                "um",
                                                "uma",
                                                "one",
                                                "uno",
                                                "un",
                                                "eins",
                                                "1"
                                            ],
                                            "2": [
                                                "dois",
                                                "duas",
                                                "two",
                                                "dos",
                                                "deux",
                                                "zwei",
                                                "2"
                                            ],
                                            "3": [
                                                "três",
                                                "tres",
                                                "three",
                                                "trois",
                                                "drei",
                                                "3"
                                            ],
                                            "4": [
                                                "quatro",
                                                "four",
                                                "cuatro",
                                                "quatre",
                                                "vier",
                                                "4"
                                            ],
                                            "desfazer": [
                                                "desfazer",
                                                "anular",
                                                "undo",
                                                "deshacer",
                                                "annuler",
                                                "rückgängig"
                                            ]
                                        },
                                        "atualizado_em": "2026-11-18T12:41:12+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Só uma cirurgia confirmada pode ser aberta."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Regra de negócio (consentimento_em_falta)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "consentimento_em_falta": {
                                        "summary": "consentimento_em_falta",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "consentimento_em_falta",
                                                "mensagem": "Sem consentimento cirúrgico válido.",
                                                "campos": {
                                                    "consentimento": "Sem consentimento cirúrgico válido."
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/painel/{id}/alta": {
            "post": {
                "tags": [
                    "Painel cirúrgico"
                ],
                "operationId": "m6PainelAlta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "summary": "Registar (ou atualizar) a alta",
                "description": "Durante ou depois da sessão (409). Exige acesso à ficha clínica do paciente. Instruções (por omissão as de Definições › Bloco; obrigatórias), medicação (cifrada; só visível com acesso à ficha clínica), contacto de urgência (por omissão o das Definições), enxertos por tipo de UF e total de cabelos (da implantação, ou da extração se não houver), número do certificado de garantia na primeira vez (Definições). Com «lavagem_inicio» marca a primeira lavagem na agenda (tipo «primeira_lavagem», confirmada, com conflitos verificados; reenvie com \"forcar\": true para aceitar avisos). Emite o documento de alta no módulo de documentos quando existe. Efeitos: auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "instrucoes": {
                                        "type": "string",
                                        "maxLength": 8000
                                    },
                                    "medicacao": {
                                        "type": "string",
                                        "maxLength": 4000
                                    },
                                    "contacto_urgencia": {
                                        "type": "string",
                                        "maxLength": 120
                                    },
                                    "lavagem_inicio": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date-time",
                                        "description": "Marcar a primeira lavagem para esta hora."
                                    },
                                    "lavagem_profissional_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "forcar": {
                                        "type": "boolean",
                                        "description": "Aceitar os avisos (conflito_aviso: feriado, fora do horário, sem horário, data passada). Nunca anula conflitos bloqueantes."
                                    }
                                }
                            },
                            "example": {
                                "instrucoes": "Dormir com a cabeça elevada nas primeiras 3 noites. Não molhar a zona recetora durante 48 h. Não usar chapéu apertado durante 10 dias.",
                                "medicacao": "Paracetamol 1 g de 8 em 8 horas durante 3 dias, se houver dor.",
                                "contacto_urgencia": "+351 210 000 000",
                                "lavagem_inicio": "2026-11-20T10:00:00+00:00",
                                "lavagem_profissional_id": 19
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "alta": {
                                                    "$ref": "#/components/schemas/M6Alta"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "alta": {
                                            "id": 97,
                                            "instrucoes": "Dormir com a cabeça elevada nas primeiras 3 noites. Não molhar a zona recetora durante 48 h. Não usar chapéu apertado durante 10 dias.",
                                            "medicacao": "Paracetamol 1 g de 8 em 8 horas durante 3 dias, se houver dor.",
                                            "medicacao_visivel": true,
                                            "contacto_urgencia": "+351 210 000 000",
                                            "primeira_lavagem": {
                                                "marcacao_id": 9011,
                                                "inicio": "2026-11-20T10:00:00+00:00",
                                                "estado": "confirmada"
                                            },
                                            "enxertos_por_tipo": {
                                                "1": 380,
                                                "2": 1100,
                                                "3": 700,
                                                "4": 120
                                            },
                                            "total_cabelos": 5160,
                                            "folha_entregue_em": null,
                                            "certificado_garantia": "GAR-2026-0088",
                                            "documento_id": 1450,
                                            "registada_por": "Paulo Matos",
                                            "registada_em": "2026-11-18T14:10:00+00:00"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido, conflito, conflito_aviso)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "A alta regista-se durante ou depois da sessão."
                                            }
                                        }
                                    },
                                    "conflito": {
                                        "summary": "conflito",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "conflito",
                                                "mensagem": "Há conflitos na agenda.",
                                                "campos": {
                                                    "profissional_id": "Paulo Matos já tem uma marcação das 10:00–10:30."
                                                }
                                            }
                                        }
                                    },
                                    "conflito_aviso": {
                                        "summary": "conflito_aviso",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "conflito_aviso",
                                                "mensagem": "Há avisos na agenda. Confirme para continuar.",
                                                "campos": {
                                                    "inicio": "Fora do horário de Paulo Matos."
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/painel/{id}/amostra": {
            "post": {
                "tags": [
                    "Painel cirúrgico"
                ],
                "operationId": "m6PainelAmostra",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "summary": "Amostra de transecção",
                "description": "n enxertos observados (1 a 1000) e quantos estavam transeccionados (0 a n), por operador. A taxa da sessão e por operador é recalculada no servidor e gravada no fecho. Sessão aberta (409).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "amostra_n": {
                                        "type": "integer",
                                        "minimum": 1,
                                        "maximum": 1000,
                                        "x-unidade": "enxertos"
                                    },
                                    "transeccionados": {
                                        "type": "integer",
                                        "minimum": 0,
                                        "x-unidade": "enxertos"
                                    },
                                    "operador_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "amostra_n",
                                    "transeccionados"
                                ]
                            },
                            "example": {
                                "amostra_n": 100,
                                "transeccionados": 3,
                                "operador_id": 7
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Painel"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "cirurgia": {
                                            "id": 214,
                                            "numero": "CIR-2026-0214",
                                            "estado": "em_curso",
                                            "estado_rotulo": "Em curso",
                                            "estado_tom": "marca",
                                            "paciente_id": 1204,
                                            "paciente_nome": "Rui Almeida",
                                            "sala_nome": "Bloco 1",
                                            "tecnica": "FUE",
                                            "inicio_previsto": "2026-11-18T08:30:00+00:00",
                                            "inicio_real": "2026-11-18T08:41:00+00:00",
                                            "fim_real": null,
                                            "fase_atual": "implantacao",
                                            "pausada": false,
                                            "pausada_em": null,
                                            "decorrido_seg": 14100,
                                            "peso_kg": 80,
                                            "consentimento": true
                                        },
                                        "fases": [
                                            {
                                                "fase": "admissao",
                                                "rotulo": "Admissão",
                                                "duracao_seg": 900,
                                                "inicio": "2026-11-18T08:41:00+00:00",
                                                "fim": "2026-11-18T08:56:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "desenho",
                                                "rotulo": "Desenho",
                                                "duracao_seg": 1200,
                                                "inicio": "2026-11-18T08:56:00+00:00",
                                                "fim": "2026-11-18T09:16:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "anestesia",
                                                "rotulo": "Anestesia",
                                                "duracao_seg": 600,
                                                "inicio": "2026-11-18T09:16:00+00:00",
                                                "fim": "2026-11-18T09:26:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "extracao",
                                                "rotulo": "Extração",
                                                "duracao_seg": 6900,
                                                "inicio": "2026-11-18T09:26:00+00:00",
                                                "fim": "2026-11-18T11:26:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "implantacao",
                                                "rotulo": "Implantação",
                                                "duracao_seg": 4500,
                                                "inicio": "2026-11-18T11:26:00+00:00",
                                                "fim": null,
                                                "atual": true,
                                                "feita": false
                                            },
                                            {
                                                "fase": "penso",
                                                "rotulo": "Penso",
                                                "duracao_seg": 0,
                                                "inicio": null,
                                                "fim": null,
                                                "atual": false,
                                                "feita": false
                                            },
                                            {
                                                "fase": "alta",
                                                "rotulo": "Alta",
                                                "duracao_seg": 0,
                                                "inicio": null,
                                                "fim": null,
                                                "atual": false,
                                                "feita": false
                                            }
                                        ],
                                        "equipa": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "operadores": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "contagens": {
                                            "extracao": {
                                                "por_tipo": {
                                                    "1": 410,
                                                    "2": 1260,
                                                    "3": 820,
                                                    "4": 140
                                                },
                                                "total": 2630,
                                                "cabelos": 5950,
                                                "cabelos_por_enxerto": 2.26
                                            },
                                            "implantacao": {
                                                "por_tipo": {
                                                    "1": 380,
                                                    "2": 1100,
                                                    "3": 700,
                                                    "4": 120
                                                },
                                                "total": 2300,
                                                "cabelos": 5160,
                                                "cabelos_por_enxerto": 2.24
                                            },
                                            "por_operador": [
                                                {
                                                    "operador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "cor": "#7A4E9C",
                                                    "extracao": 2630,
                                                    "implantacao": 0,
                                                    "por_tipo": {
                                                        "1": 410,
                                                        "2": 1260,
                                                        "3": 820,
                                                        "4": 140
                                                    },
                                                    "por_hora": 780
                                                },
                                                {
                                                    "operador_id": 15,
                                                    "nome": "Marta Sousa",
                                                    "cor": "#C0743A",
                                                    "extracao": 0,
                                                    "implantacao": 2300,
                                                    "por_tipo": {
                                                        "1": 380,
                                                        "2": 1100,
                                                        "3": 700,
                                                        "4": 120
                                                    },
                                                    "por_hora": 920
                                                }
                                            ]
                                        },
                                        "planeado": 2850,
                                        "progresso": {
                                            "extraido_pct": 92,
                                            "implantado_pct": 81
                                        },
                                        "ultima_contagem": {
                                            "id": 90412,
                                            "tipo_uf": 2,
                                            "momento": "implantacao",
                                            "operador": "Marta Sousa",
                                            "criado_em": "2026-11-18T12:41:09+00:00"
                                        },
                                        "lotes": [
                                            {
                                                "id": 51,
                                                "lote": "L1",
                                                "quantidade": 600,
                                                "operador": "Inês Valente",
                                                "extraido_em": "2026-11-18T09:50:00+00:00",
                                                "implantado_em": "2026-11-18T11:35:00+00:00",
                                                "horas_fora": 1.75,
                                                "estado": "ok"
                                            },
                                            {
                                                "id": 52,
                                                "lote": "L2",
                                                "quantidade": 700,
                                                "operador": "Inês Valente",
                                                "extraido_em": "2026-11-18T10:30:00+00:00",
                                                "implantado_em": null,
                                                "horas_fora": 2.18,
                                                "estado": "ok"
                                            }
                                        ],
                                        "tempo_fora": {
                                            "alerta_h": 4,
                                            "maximo_h": 6
                                        },
                                        "transeccao": {
                                            "sessao_pct": 3.5,
                                            "amostras": 2,
                                            "observados": 200,
                                            "por_operador": [
                                                {
                                                    "operador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "pct": 3.5,
                                                    "observados": 200
                                                }
                                            ]
                                        },
                                        "plano": {
                                            "id": 318,
                                            "versao": 3,
                                            "tecnica": "FUE",
                                            "enxertos_necessarios": 3200,
                                            "capacidade_sessao": 2850,
                                            "zonas": [
                                                {
                                                    "zona": "linha_frontal",
                                                    "rotulo": "Linha frontal",
                                                    "area_cm2": 15,
                                                    "densidade_alvo": 25,
                                                    "enxertos": 375
                                                },
                                                {
                                                    "zona": "frontal",
                                                    "rotulo": "Frontal",
                                                    "area_cm2": 60,
                                                    "densidade_alvo": 30,
                                                    "enxertos": 1800
                                                }
                                            ]
                                        },
                                        "enfermagem": {
                                            "visivel": true,
                                            "registos": [
                                                {
                                                    "id": 3302,
                                                    "tipo": "sinais_vitais",
                                                    "tipo_rotulo": "Sinais vitais",
                                                    "dados": {
                                                        "tas": 128,
                                                        "tad": 79,
                                                        "fc": 72,
                                                        "spo2": 98
                                                    },
                                                    "texto": "TA 128/79 mmHg · FC 72 bpm · SpO₂ 98 %",
                                                    "autor": "Paulo Matos",
                                                    "registado_em": "2026-11-18T10:00:00+00:00",
                                                    "anulado": false,
                                                    "motivo_anulacao": null
                                                },
                                                {
                                                    "id": 3301,
                                                    "tipo": "farmaco",
                                                    "tipo_rotulo": "Fármaco",
                                                    "dados": {
                                                        "nome": "Lidocaína com adrenalina",
                                                        "dose": 34,
                                                        "unidade": "ml",
                                                        "concentracao_pct": 1,
                                                        "via": "local",
                                                        "hora": "09:05",
                                                        "lote": "LX2291",
                                                        "adrenalina": true,
                                                        "artigo_id": 58
                                                    },
                                                    "texto": "Lidocaína com adrenalina 34,00 ml (1,0 %) · Local · 09:05 · Lote LX2291 · com adrenalina",
                                                    "autor": "Paulo Matos",
                                                    "registado_em": "2026-11-18T09:05:00+00:00",
                                                    "anulado": false,
                                                    "motivo_anulacao": null
                                                }
                                            ],
                                            "lidocaina": {
                                                "mg_total": 340,
                                                "mg_kg": 4.25,
                                                "limite": 7,
                                                "com_adrenalina": true,
                                                "aviso_pct": 80,
                                                "percentagem": 61,
                                                "estado": "ok",
                                                "peso_kg": 80
                                            },
                                            "sinais_vitais": {
                                                "ultimo_em": "2026-11-18T10:00:00+00:00",
                                                "intervalo_min": 60,
                                                "em_atraso": false
                                            },
                                            "dor_ultima": 2,
                                            "vias": [
                                                {
                                                    "valor": "local",
                                                    "rotulo": "Local"
                                                },
                                                {
                                                    "valor": "subcutanea",
                                                    "rotulo": "Subcutânea"
                                                },
                                                {
                                                    "valor": "oral",
                                                    "rotulo": "Oral"
                                                }
                                            ],
                                            "unidades": [
                                                "mg",
                                                "ml",
                                                "mcg",
                                                "UI",
                                                "g"
                                            ]
                                        },
                                        "checklists": [
                                            {
                                                "id": 611,
                                                "nome": "Verificação de segurança antes da cirurgia",
                                                "fase": "pre_operatorio",
                                                "fase_rotulo": "Pré-operatório",
                                                "estado": "concluida",
                                                "itens": [
                                                    {
                                                        "texto": "Identidade do paciente confirmada",
                                                        "responsavel_papel": "enfermeiro",
                                                        "obrigatorio": true,
                                                        "feito": true,
                                                        "feito_por": 19,
                                                        "feito_por_nome": "Paulo Matos",
                                                        "feito_em": "2026-11-17T16:20:00+00:00"
                                                    },
                                                    {
                                                        "texto": "Análises pré-operatórias revistas",
                                                        "responsavel_papel": "cirurgiao",
                                                        "obrigatorio": true,
                                                        "feito": false,
                                                        "feito_por": null,
                                                        "feito_por_nome": null,
                                                        "feito_em": null
                                                    },
                                                    {
                                                        "texto": "Fotografias pré-operatórias tiradas",
                                                        "responsavel_papel": "tecnico",
                                                        "obrigatorio": false,
                                                        "feito": false,
                                                        "feito_por": null,
                                                        "feito_por_nome": null,
                                                        "feito_em": null
                                                    }
                                                ],
                                                "feitos": 3,
                                                "total": 3,
                                                "concluida_em": "2026-11-18T08:20:00+00:00"
                                            }
                                        ],
                                        "alta": null,
                                        "permissoes": {
                                            "registar": true,
                                            "abrir": false,
                                            "fechar": true,
                                            "enfermagem": true
                                        },
                                        "voz_palavras": {
                                            "1": [
                                                "um",
                                                "uma",
                                                "one",
                                                "uno",
                                                "un",
                                                "eins",
                                                "1"
                                            ],
                                            "2": [
                                                "dois",
                                                "duas",
                                                "two",
                                                "dos",
                                                "deux",
                                                "zwei",
                                                "2"
                                            ],
                                            "3": [
                                                "três",
                                                "tres",
                                                "three",
                                                "trois",
                                                "drei",
                                                "3"
                                            ],
                                            "4": [
                                                "quatro",
                                                "four",
                                                "cuatro",
                                                "quatre",
                                                "vier",
                                                "4"
                                            ],
                                            "desfazer": [
                                                "desfazer",
                                                "anular",
                                                "undo",
                                                "deshacer",
                                                "annuler",
                                                "rückgängig"
                                            ]
                                        },
                                        "atualizado_em": "2026-11-18T12:41:12+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Abra primeiro a sessão."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/painel/{id}/anular": {
            "post": {
                "tags": [
                    "Painel cirúrgico"
                ],
                "operationId": "m6PainelAnularEnfermagem",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "summary": "Anular um registo de enfermagem",
                "description": "Correção por anulação com motivo obrigatório (até 255 caracteres): o registo original mantém-se, marcado como anulado, e deixa de contar (por exemplo na dose de lidocaína). Registo inexistente ou já anulado → 404. Cirurgia concluída ou cancelada → 409. Efeitos: auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "registo_id": {
                                        "type": "integer"
                                    },
                                    "motivo": {
                                        "type": "string",
                                        "minLength": 1,
                                        "maxLength": 255
                                    }
                                },
                                "required": [
                                    "registo_id",
                                    "motivo"
                                ]
                            },
                            "example": {
                                "registo_id": 3301,
                                "motivo": "Dose registada em duplicado."
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "enfermagem": {
                                                    "$ref": "#/components/schemas/M6Enfermagem"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "enfermagem": {
                                            "visivel": true,
                                            "registos": [
                                                {
                                                    "id": 3302,
                                                    "tipo": "sinais_vitais",
                                                    "tipo_rotulo": "Sinais vitais",
                                                    "dados": {
                                                        "tas": 128,
                                                        "tad": 79,
                                                        "fc": 72,
                                                        "spo2": 98
                                                    },
                                                    "texto": "TA 128/79 mmHg · FC 72 bpm · SpO₂ 98 %",
                                                    "autor": "Paulo Matos",
                                                    "registado_em": "2026-11-18T10:00:00+00:00",
                                                    "anulado": false,
                                                    "motivo_anulacao": null
                                                },
                                                {
                                                    "id": 3301,
                                                    "tipo": "farmaco",
                                                    "tipo_rotulo": "Fármaco",
                                                    "dados": {
                                                        "nome": "Lidocaína com adrenalina",
                                                        "dose": 34,
                                                        "unidade": "ml",
                                                        "concentracao_pct": 1,
                                                        "via": "local",
                                                        "hora": "09:05",
                                                        "lote": "LX2291",
                                                        "adrenalina": true,
                                                        "artigo_id": 58
                                                    },
                                                    "texto": "Lidocaína com adrenalina 34,00 ml (1,0 %) · Local · 09:05 · Lote LX2291 · com adrenalina",
                                                    "autor": "Paulo Matos",
                                                    "registado_em": "2026-11-18T09:05:00+00:00",
                                                    "anulado": false,
                                                    "motivo_anulacao": null
                                                }
                                            ],
                                            "lidocaina": {
                                                "mg_total": 340,
                                                "mg_kg": 4.25,
                                                "limite": 7,
                                                "com_adrenalina": true,
                                                "aviso_pct": 80,
                                                "percentagem": 61,
                                                "estado": "ok",
                                                "peso_kg": 80
                                            },
                                            "sinais_vitais": {
                                                "ultimo_em": "2026-11-18T10:00:00+00:00",
                                                "intervalo_min": 60,
                                                "em_atraso": false
                                            },
                                            "dor_ultima": 2,
                                            "vias": [
                                                {
                                                    "valor": "local",
                                                    "rotulo": "Local"
                                                },
                                                {
                                                    "valor": "subcutanea",
                                                    "rotulo": "Subcutânea"
                                                },
                                                {
                                                    "valor": "oral",
                                                    "rotulo": "Oral"
                                                }
                                            ],
                                            "unidades": [
                                                "mg",
                                                "ml",
                                                "mcg",
                                                "UI",
                                                "g"
                                            ]
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "A sessão já está fechada."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/painel/{id}/checklist": {
            "post": {
                "tags": [
                    "Painel cirúrgico"
                ],
                "operationId": "m6PainelChecklist",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "summary": "Marcar um item de uma checklist da sessão",
                "description": "Mesmas regras de POST /bloco/checklists/{id}/itens, a partir do painel (checklist_id de M6Painel.checklists).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "checklist_id": {
                                        "type": "integer"
                                    },
                                    "indice": {
                                        "type": "integer",
                                        "minimum": 0
                                    },
                                    "feito": {
                                        "type": "boolean"
                                    }
                                },
                                "required": [
                                    "checklist_id",
                                    "indice",
                                    "feito"
                                ]
                            },
                            "example": {
                                "checklist_id": 640,
                                "indice": 0,
                                "feito": true
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "checklist": {
                                                    "$ref": "#/components/schemas/M6Checklist"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "checklist": {
                                            "id": 640,
                                            "nome": "Implantação",
                                            "fase": "implantacao",
                                            "fase_rotulo": "Implantação",
                                            "estado": "aberta",
                                            "itens": [
                                                {
                                                    "texto": "Identidade do paciente confirmada",
                                                    "responsavel_papel": "enfermeiro",
                                                    "obrigatorio": true,
                                                    "feito": true,
                                                    "feito_por": 19,
                                                    "feito_por_nome": "Paulo Matos",
                                                    "feito_em": "2026-11-17T16:20:00+00:00"
                                                },
                                                {
                                                    "texto": "Análises pré-operatórias revistas",
                                                    "responsavel_papel": "cirurgiao",
                                                    "obrigatorio": true,
                                                    "feito": false,
                                                    "feito_por": null,
                                                    "feito_por_nome": null,
                                                    "feito_em": null
                                                },
                                                {
                                                    "texto": "Fotografias pré-operatórias tiradas",
                                                    "responsavel_papel": "tecnico",
                                                    "obrigatorio": false,
                                                    "feito": false,
                                                    "feito_por": null,
                                                    "feito_por_nome": null,
                                                    "feito_em": null
                                                }
                                            ],
                                            "feitos": 1,
                                            "total": 3,
                                            "concluida_em": null
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "A sessão já está fechada."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/painel/{id}/contar": {
            "post": {
                "tags": [
                    "Painel cirúrgico"
                ],
                "operationId": "m6PainelContar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "summary": "Contar enxertos",
                "description": "Regista enxertos por tipo de UF — 1, 2, 3 ou 4 (4 = 4 ou mais cabelos; conta como o número de cabelos de Definições › Bloco, mínimo 4) — no momento extração ou implantação, por operador (por omissão quem regista), por toque, voz ou pedal/teclas. Quantidade 1 por omissão, até 50 de uma vez para corrigir em bloco. Sessão aberta (409). Resposta leve para o ecrã de contagem (sem o painel completo). Limite: 600 pedidos por minuto.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "tipo_uf": {
                                        "type": "integer",
                                        "enum": [
                                            1,
                                            2,
                                            3,
                                            4
                                        ],
                                        "description": "Tipo de UF (4 = 4+ cabelos)."
                                    },
                                    "momento": {
                                        "type": "string",
                                        "enum": [
                                            "extracao",
                                            "implantacao"
                                        ],
                                        "default": "extracao"
                                    },
                                    "quantidade": {
                                        "type": "integer",
                                        "minimum": 1,
                                        "maximum": 50,
                                        "default": 1,
                                        "x-unidade": "enxertos"
                                    },
                                    "origem": {
                                        "type": "string",
                                        "enum": [
                                            "toque",
                                            "voz",
                                            "pedal"
                                        ],
                                        "default": "toque"
                                    },
                                    "operador_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "description": "Operador (por omissão quem regista)."
                                    },
                                    "lote": {
                                        "type": "string",
                                        "maxLength": 20
                                    }
                                },
                                "required": [
                                    "tipo_uf"
                                ]
                            },
                            "example": {
                                "tipo_uf": 2,
                                "momento": "implantacao",
                                "quantidade": 1,
                                "origem": "toque",
                                "operador_id": 15
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6ResumoContagem"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "contagens": {
                                            "extracao": {
                                                "por_tipo": {
                                                    "1": 410,
                                                    "2": 1260,
                                                    "3": 820,
                                                    "4": 140
                                                },
                                                "total": 2630,
                                                "cabelos": 5950,
                                                "cabelos_por_enxerto": 2.26
                                            },
                                            "implantacao": {
                                                "por_tipo": {
                                                    "1": 380,
                                                    "2": 1100,
                                                    "3": 700,
                                                    "4": 120
                                                },
                                                "total": 2300,
                                                "cabelos": 5160,
                                                "cabelos_por_enxerto": 2.24
                                            },
                                            "por_operador": [
                                                {
                                                    "operador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "cor": "#7A4E9C",
                                                    "extracao": 2630,
                                                    "implantacao": 0,
                                                    "por_tipo": {
                                                        "1": 410,
                                                        "2": 1260,
                                                        "3": 820,
                                                        "4": 140
                                                    },
                                                    "por_hora": 780
                                                },
                                                {
                                                    "operador_id": 15,
                                                    "nome": "Marta Sousa",
                                                    "cor": "#C0743A",
                                                    "extracao": 0,
                                                    "implantacao": 2300,
                                                    "por_tipo": {
                                                        "1": 380,
                                                        "2": 1100,
                                                        "3": 700,
                                                        "4": 120
                                                    },
                                                    "por_hora": 920
                                                }
                                            ]
                                        },
                                        "planeado": 2850,
                                        "progresso": {
                                            "extraido_pct": 92,
                                            "implantado_pct": 81
                                        },
                                        "ultima_contagem": {
                                            "id": 90412,
                                            "tipo_uf": 2,
                                            "momento": "implantacao",
                                            "operador": "Marta Sousa",
                                            "criado_em": "2026-11-18T12:41:09+00:00"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Abra primeiro a sessão."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/painel/{id}/desfazer": {
            "post": {
                "tags": [
                    "Painel cirúrgico"
                ],
                "operationId": "m6PainelDesfazer",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "summary": "Desfazer a última contagem",
                "description": "Anula (registo clínico: nada se apaga) a última contagem dos últimos 10 minutos, ou a indicada em «contagem_id» se ainda estiver nessa janela. Sem contagens recentes → 409 «nada_a_desfazer». Sessão aberta (409).",
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "contagem_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "contagem_id": 90412
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6ResumoContagem"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "contagens": {
                                            "extracao": {
                                                "por_tipo": {
                                                    "1": 410,
                                                    "2": 1260,
                                                    "3": 820,
                                                    "4": 140
                                                },
                                                "total": 2630,
                                                "cabelos": 5950,
                                                "cabelos_por_enxerto": 2.26
                                            },
                                            "implantacao": {
                                                "por_tipo": {
                                                    "1": 380,
                                                    "2": 1100,
                                                    "3": 700,
                                                    "4": 120
                                                },
                                                "total": 2300,
                                                "cabelos": 5160,
                                                "cabelos_por_enxerto": 2.24
                                            },
                                            "por_operador": [
                                                {
                                                    "operador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "cor": "#7A4E9C",
                                                    "extracao": 2630,
                                                    "implantacao": 0,
                                                    "por_tipo": {
                                                        "1": 410,
                                                        "2": 1260,
                                                        "3": 820,
                                                        "4": 140
                                                    },
                                                    "por_hora": 780
                                                },
                                                {
                                                    "operador_id": 15,
                                                    "nome": "Marta Sousa",
                                                    "cor": "#C0743A",
                                                    "extracao": 0,
                                                    "implantacao": 2300,
                                                    "por_tipo": {
                                                        "1": 380,
                                                        "2": 1100,
                                                        "3": 700,
                                                        "4": 120
                                                    },
                                                    "por_hora": 920
                                                }
                                            ]
                                        },
                                        "planeado": 2850,
                                        "progresso": {
                                            "extraido_pct": 92,
                                            "implantado_pct": 81
                                        },
                                        "ultima_contagem": {
                                            "id": 90412,
                                            "tipo_uf": 2,
                                            "momento": "implantacao",
                                            "operador": "Marta Sousa",
                                            "criado_em": "2026-11-18T12:41:09+00:00"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (nada_a_desfazer, estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "nada_a_desfazer": {
                                        "summary": "nada_a_desfazer",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "nada_a_desfazer",
                                                "mensagem": "Não há contagens recentes para desfazer."
                                            }
                                        }
                                    },
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Abra primeiro a sessão."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/painel/{id}/enfermagem": {
            "post": {
                "tags": [
                    "Painel cirúrgico"
                ],
                "operationId": "m6PainelEnfermagem",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "summary": "Registo de enfermagem e anestesia",
                "description": "Tipos: sinais_vitais, farmaco, dor, incidente, nota (campos e intervalos em M6EnfSinaisVitais, M6EnfFarmaco, M6EnfDor, M6EnfIncidente, M6EnfNota). Dados cifrados com a chave clínica; a auditoria só guarda os nomes dos campos. Exige acesso à ficha clínica do paciente. Lidocaína (nome com lidoca/xiloca/lignoca): dose acumulada em mg (ml × concentração % × 10; mcg ÷ 1000; g × 1000) a dividir pelo peso; limite 4,5 mg/kg, ou 7 mg/kg quando todas as administrações levaram adrenalina (Definições › Bloco); «aviso» a partir da percentagem de aviso (80 % por omissão) e «perigo» ao atingir o limite — nesses casos a equipa da cirurgia recebe uma notificação (sem conteúdo clínico). Em ml de lidocaína a concentração é obrigatória. Um incidente de gravidade alta também notifica a equipa. Cirurgia concluída ou cancelada → 409.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "tipo": {
                                        "type": "string",
                                        "enum": [
                                            "sinais_vitais",
                                            "farmaco",
                                            "dor",
                                            "incidente",
                                            "nota"
                                        ]
                                    },
                                    "dados": {
                                        "oneOf": [
                                            {
                                                "$ref": "#/components/schemas/M6EnfSinaisVitais"
                                            },
                                            {
                                                "$ref": "#/components/schemas/M6EnfFarmaco"
                                            },
                                            {
                                                "$ref": "#/components/schemas/M6EnfDor"
                                            },
                                            {
                                                "$ref": "#/components/schemas/M6EnfIncidente"
                                            },
                                            {
                                                "$ref": "#/components/schemas/M6EnfNota"
                                            }
                                        ]
                                    },
                                    "registado_em": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date-time",
                                        "description": "Hora do registo (por omissão agora)."
                                    }
                                },
                                "required": [
                                    "tipo",
                                    "dados"
                                ]
                            },
                            "example": {
                                "tipo": "farmaco",
                                "dados": {
                                    "nome": "Lidocaína com adrenalina",
                                    "dose": 34,
                                    "unidade": "ml",
                                    "concentracao_pct": 1,
                                    "via": "local",
                                    "hora": "09:05",
                                    "lote": "LX2291",
                                    "adrenalina": true,
                                    "artigo_id": 58
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "enfermagem": {
                                                    "$ref": "#/components/schemas/M6Enfermagem"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "enfermagem": {
                                            "visivel": true,
                                            "registos": [
                                                {
                                                    "id": 3302,
                                                    "tipo": "sinais_vitais",
                                                    "tipo_rotulo": "Sinais vitais",
                                                    "dados": {
                                                        "tas": 128,
                                                        "tad": 79,
                                                        "fc": 72,
                                                        "spo2": 98
                                                    },
                                                    "texto": "TA 128/79 mmHg · FC 72 bpm · SpO₂ 98 %",
                                                    "autor": "Paulo Matos",
                                                    "registado_em": "2026-11-18T10:00:00+00:00",
                                                    "anulado": false,
                                                    "motivo_anulacao": null
                                                },
                                                {
                                                    "id": 3301,
                                                    "tipo": "farmaco",
                                                    "tipo_rotulo": "Fármaco",
                                                    "dados": {
                                                        "nome": "Lidocaína com adrenalina",
                                                        "dose": 34,
                                                        "unidade": "ml",
                                                        "concentracao_pct": 1,
                                                        "via": "local",
                                                        "hora": "09:05",
                                                        "lote": "LX2291",
                                                        "adrenalina": true,
                                                        "artigo_id": 58
                                                    },
                                                    "texto": "Lidocaína com adrenalina 34,00 ml (1,0 %) · Local · 09:05 · Lote LX2291 · com adrenalina",
                                                    "autor": "Paulo Matos",
                                                    "registado_em": "2026-11-18T09:05:00+00:00",
                                                    "anulado": false,
                                                    "motivo_anulacao": null
                                                }
                                            ],
                                            "lidocaina": {
                                                "mg_total": 340,
                                                "mg_kg": 4.25,
                                                "limite": 7,
                                                "com_adrenalina": true,
                                                "aviso_pct": 80,
                                                "percentagem": 61,
                                                "estado": "ok",
                                                "peso_kg": 80
                                            },
                                            "sinais_vitais": {
                                                "ultimo_em": "2026-11-18T10:00:00+00:00",
                                                "intervalo_min": 60,
                                                "em_atraso": false
                                            },
                                            "dor_ultima": 2,
                                            "vias": [
                                                {
                                                    "valor": "local",
                                                    "rotulo": "Local"
                                                },
                                                {
                                                    "valor": "subcutanea",
                                                    "rotulo": "Subcutânea"
                                                },
                                                {
                                                    "valor": "oral",
                                                    "rotulo": "Oral"
                                                }
                                            ],
                                            "unidades": [
                                                "mg",
                                                "ml",
                                                "mcg",
                                                "UI",
                                                "g"
                                            ]
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "A sessão já está fechada."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/painel/{id}/entregue": {
            "post": {
                "tags": [
                    "Painel cirúrgico"
                ],
                "operationId": "m6PainelFolhaEntregue",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "summary": "Folha de alta entregue ao paciente",
                "description": "Regista a hora de entrega da folha de alta (enxertos por tipo de UF e total de cabelos). Sem alta registada → 404. Efeitos: auditoria «imprimir».",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "alta": {
                                                    "$ref": "#/components/schemas/M6Alta"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "alta": {
                                            "id": 97,
                                            "instrucoes": "Dormir com a cabeça elevada nas primeiras 3 noites. Não molhar a zona recetora durante 48 h. Não usar chapéu apertado durante 10 dias.",
                                            "medicacao": "Paracetamol 1 g de 8 em 8 horas durante 3 dias, se houver dor.",
                                            "medicacao_visivel": true,
                                            "contacto_urgencia": "+351 210 000 000",
                                            "primeira_lavagem": {
                                                "marcacao_id": 9011,
                                                "inicio": "2026-11-20T10:00:00+00:00",
                                                "estado": "confirmada"
                                            },
                                            "enxertos_por_tipo": {
                                                "1": 380,
                                                "2": 1100,
                                                "3": 700,
                                                "4": 120
                                            },
                                            "total_cabelos": 5160,
                                            "folha_entregue_em": "2026-11-18T14:25:00+00:00",
                                            "certificado_garantia": "GAR-2026-0088",
                                            "documento_id": 1450,
                                            "registada_por": "Paulo Matos",
                                            "registada_em": "2026-11-18T14:10:00+00:00"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/painel/{id}/fase": {
            "post": {
                "tags": [
                    "Painel cirúrgico"
                ],
                "operationId": "m6PainelFase",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "summary": "Mudar de fase",
                "description": "Sessão aberta (409). Fecha a fase atual (desconta as pausas), abre a nova e cria as checklists dessa fase (ids em «checklists_novas»). A marcação muda de posto no fluxo do dia (desenho/anestesia → preparação, extração, implantação, penso → recobro). Pedir a fase atual devolve o painel sem mudanças. Efeitos: auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "fase": {
                                        "type": "string",
                                        "enum": [
                                            "admissao",
                                            "desenho",
                                            "anestesia",
                                            "extracao",
                                            "implantacao",
                                            "penso",
                                            "alta"
                                        ]
                                    }
                                },
                                "required": [
                                    "fase"
                                ]
                            },
                            "example": {
                                "fase": "implantacao"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "allOf": [
                                                {
                                                    "$ref": "#/components/schemas/M6Painel"
                                                },
                                                {
                                                    "type": "object",
                                                    "properties": {
                                                        "checklists_novas": {
                                                            "type": "array",
                                                            "items": {
                                                                "type": "integer"
                                                            }
                                                        }
                                                    }
                                                }
                                            ]
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "cirurgia": {
                                            "id": 214,
                                            "numero": "CIR-2026-0214",
                                            "estado": "em_curso",
                                            "estado_rotulo": "Em curso",
                                            "estado_tom": "marca",
                                            "paciente_id": 1204,
                                            "paciente_nome": "Rui Almeida",
                                            "sala_nome": "Bloco 1",
                                            "tecnica": "FUE",
                                            "inicio_previsto": "2026-11-18T08:30:00+00:00",
                                            "inicio_real": "2026-11-18T08:41:00+00:00",
                                            "fim_real": null,
                                            "fase_atual": "implantacao",
                                            "pausada": false,
                                            "pausada_em": null,
                                            "decorrido_seg": 14100,
                                            "peso_kg": 80,
                                            "consentimento": true
                                        },
                                        "fases": [
                                            {
                                                "fase": "admissao",
                                                "rotulo": "Admissão",
                                                "duracao_seg": 900,
                                                "inicio": "2026-11-18T08:41:00+00:00",
                                                "fim": "2026-11-18T08:56:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "desenho",
                                                "rotulo": "Desenho",
                                                "duracao_seg": 1200,
                                                "inicio": "2026-11-18T08:56:00+00:00",
                                                "fim": "2026-11-18T09:16:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "anestesia",
                                                "rotulo": "Anestesia",
                                                "duracao_seg": 600,
                                                "inicio": "2026-11-18T09:16:00+00:00",
                                                "fim": "2026-11-18T09:26:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "extracao",
                                                "rotulo": "Extração",
                                                "duracao_seg": 6900,
                                                "inicio": "2026-11-18T09:26:00+00:00",
                                                "fim": "2026-11-18T11:26:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "implantacao",
                                                "rotulo": "Implantação",
                                                "duracao_seg": 4500,
                                                "inicio": "2026-11-18T11:26:00+00:00",
                                                "fim": null,
                                                "atual": true,
                                                "feita": false
                                            },
                                            {
                                                "fase": "penso",
                                                "rotulo": "Penso",
                                                "duracao_seg": 0,
                                                "inicio": null,
                                                "fim": null,
                                                "atual": false,
                                                "feita": false
                                            },
                                            {
                                                "fase": "alta",
                                                "rotulo": "Alta",
                                                "duracao_seg": 0,
                                                "inicio": null,
                                                "fim": null,
                                                "atual": false,
                                                "feita": false
                                            }
                                        ],
                                        "equipa": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "operadores": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "contagens": {
                                            "extracao": {
                                                "por_tipo": {
                                                    "1": 410,
                                                    "2": 1260,
                                                    "3": 820,
                                                    "4": 140
                                                },
                                                "total": 2630,
                                                "cabelos": 5950,
                                                "cabelos_por_enxerto": 2.26
                                            },
                                            "implantacao": {
                                                "por_tipo": {
                                                    "1": 380,
                                                    "2": 1100,
                                                    "3": 700,
                                                    "4": 120
                                                },
                                                "total": 2300,
                                                "cabelos": 5160,
                                                "cabelos_por_enxerto": 2.24
                                            },
                                            "por_operador": [
                                                {
                                                    "operador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "cor": "#7A4E9C",
                                                    "extracao": 2630,
                                                    "implantacao": 0,
                                                    "por_tipo": {
                                                        "1": 410,
                                                        "2": 1260,
                                                        "3": 820,
                                                        "4": 140
                                                    },
                                                    "por_hora": 780
                                                },
                                                {
                                                    "operador_id": 15,
                                                    "nome": "Marta Sousa",
                                                    "cor": "#C0743A",
                                                    "extracao": 0,
                                                    "implantacao": 2300,
                                                    "por_tipo": {
                                                        "1": 380,
                                                        "2": 1100,
                                                        "3": 700,
                                                        "4": 120
                                                    },
                                                    "por_hora": 920
                                                }
                                            ]
                                        },
                                        "planeado": 2850,
                                        "progresso": {
                                            "extraido_pct": 92,
                                            "implantado_pct": 81
                                        },
                                        "ultima_contagem": {
                                            "id": 90412,
                                            "tipo_uf": 2,
                                            "momento": "implantacao",
                                            "operador": "Marta Sousa",
                                            "criado_em": "2026-11-18T12:41:09+00:00"
                                        },
                                        "lotes": [
                                            {
                                                "id": 51,
                                                "lote": "L1",
                                                "quantidade": 600,
                                                "operador": "Inês Valente",
                                                "extraido_em": "2026-11-18T09:50:00+00:00",
                                                "implantado_em": "2026-11-18T11:35:00+00:00",
                                                "horas_fora": 1.75,
                                                "estado": "ok"
                                            },
                                            {
                                                "id": 52,
                                                "lote": "L2",
                                                "quantidade": 700,
                                                "operador": "Inês Valente",
                                                "extraido_em": "2026-11-18T10:30:00+00:00",
                                                "implantado_em": null,
                                                "horas_fora": 2.18,
                                                "estado": "ok"
                                            }
                                        ],
                                        "tempo_fora": {
                                            "alerta_h": 4,
                                            "maximo_h": 6
                                        },
                                        "transeccao": {
                                            "sessao_pct": 3.5,
                                            "amostras": 2,
                                            "observados": 200,
                                            "por_operador": [
                                                {
                                                    "operador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "pct": 3.5,
                                                    "observados": 200
                                                }
                                            ]
                                        },
                                        "plano": {
                                            "id": 318,
                                            "versao": 3,
                                            "tecnica": "FUE",
                                            "enxertos_necessarios": 3200,
                                            "capacidade_sessao": 2850,
                                            "zonas": [
                                                {
                                                    "zona": "linha_frontal",
                                                    "rotulo": "Linha frontal",
                                                    "area_cm2": 15,
                                                    "densidade_alvo": 25,
                                                    "enxertos": 375
                                                },
                                                {
                                                    "zona": "frontal",
                                                    "rotulo": "Frontal",
                                                    "area_cm2": 60,
                                                    "densidade_alvo": 30,
                                                    "enxertos": 1800
                                                }
                                            ]
                                        },
                                        "enfermagem": {
                                            "visivel": true,
                                            "registos": [
                                                {
                                                    "id": 3302,
                                                    "tipo": "sinais_vitais",
                                                    "tipo_rotulo": "Sinais vitais",
                                                    "dados": {
                                                        "tas": 128,
                                                        "tad": 79,
                                                        "fc": 72,
                                                        "spo2": 98
                                                    },
                                                    "texto": "TA 128/79 mmHg · FC 72 bpm · SpO₂ 98 %",
                                                    "autor": "Paulo Matos",
                                                    "registado_em": "2026-11-18T10:00:00+00:00",
                                                    "anulado": false,
                                                    "motivo_anulacao": null
                                                },
                                                {
                                                    "id": 3301,
                                                    "tipo": "farmaco",
                                                    "tipo_rotulo": "Fármaco",
                                                    "dados": {
                                                        "nome": "Lidocaína com adrenalina",
                                                        "dose": 34,
                                                        "unidade": "ml",
                                                        "concentracao_pct": 1,
                                                        "via": "local",
                                                        "hora": "09:05",
                                                        "lote": "LX2291",
                                                        "adrenalina": true,
                                                        "artigo_id": 58
                                                    },
                                                    "texto": "Lidocaína com adrenalina 34,00 ml (1,0 %) · Local · 09:05 · Lote LX2291 · com adrenalina",
                                                    "autor": "Paulo Matos",
                                                    "registado_em": "2026-11-18T09:05:00+00:00",
                                                    "anulado": false,
                                                    "motivo_anulacao": null
                                                }
                                            ],
                                            "lidocaina": {
                                                "mg_total": 340,
                                                "mg_kg": 4.25,
                                                "limite": 7,
                                                "com_adrenalina": true,
                                                "aviso_pct": 80,
                                                "percentagem": 61,
                                                "estado": "ok",
                                                "peso_kg": 80
                                            },
                                            "sinais_vitais": {
                                                "ultimo_em": "2026-11-18T10:00:00+00:00",
                                                "intervalo_min": 60,
                                                "em_atraso": false
                                            },
                                            "dor_ultima": 2,
                                            "vias": [
                                                {
                                                    "valor": "local",
                                                    "rotulo": "Local"
                                                },
                                                {
                                                    "valor": "subcutanea",
                                                    "rotulo": "Subcutânea"
                                                },
                                                {
                                                    "valor": "oral",
                                                    "rotulo": "Oral"
                                                }
                                            ],
                                            "unidades": [
                                                "mg",
                                                "ml",
                                                "mcg",
                                                "UI",
                                                "g"
                                            ]
                                        },
                                        "checklists": [
                                            {
                                                "id": 611,
                                                "nome": "Verificação de segurança antes da cirurgia",
                                                "fase": "pre_operatorio",
                                                "fase_rotulo": "Pré-operatório",
                                                "estado": "concluida",
                                                "itens": [
                                                    {
                                                        "texto": "Identidade do paciente confirmada",
                                                        "responsavel_papel": "enfermeiro",
                                                        "obrigatorio": true,
                                                        "feito": true,
                                                        "feito_por": 19,
                                                        "feito_por_nome": "Paulo Matos",
                                                        "feito_em": "2026-11-17T16:20:00+00:00"
                                                    },
                                                    {
                                                        "texto": "Análises pré-operatórias revistas",
                                                        "responsavel_papel": "cirurgiao",
                                                        "obrigatorio": true,
                                                        "feito": false,
                                                        "feito_por": null,
                                                        "feito_por_nome": null,
                                                        "feito_em": null
                                                    },
                                                    {
                                                        "texto": "Fotografias pré-operatórias tiradas",
                                                        "responsavel_papel": "tecnico",
                                                        "obrigatorio": false,
                                                        "feito": false,
                                                        "feito_por": null,
                                                        "feito_por_nome": null,
                                                        "feito_em": null
                                                    }
                                                ],
                                                "feitos": 3,
                                                "total": 3,
                                                "concluida_em": "2026-11-18T08:20:00+00:00"
                                            }
                                        ],
                                        "alta": null,
                                        "permissoes": {
                                            "registar": true,
                                            "abrir": false,
                                            "fechar": true,
                                            "enfermagem": true
                                        },
                                        "voz_palavras": {
                                            "1": [
                                                "um",
                                                "uma",
                                                "one",
                                                "uno",
                                                "un",
                                                "eins",
                                                "1"
                                            ],
                                            "2": [
                                                "dois",
                                                "duas",
                                                "two",
                                                "dos",
                                                "deux",
                                                "zwei",
                                                "2"
                                            ],
                                            "3": [
                                                "três",
                                                "tres",
                                                "three",
                                                "trois",
                                                "drei",
                                                "3"
                                            ],
                                            "4": [
                                                "quatro",
                                                "four",
                                                "cuatro",
                                                "quatre",
                                                "vier",
                                                "4"
                                            ],
                                            "desfazer": [
                                                "desfazer",
                                                "anular",
                                                "undo",
                                                "deshacer",
                                                "annuler",
                                                "rückgängig"
                                            ]
                                        },
                                        "atualizado_em": "2026-11-18T12:41:12+00:00",
                                        "checklists_novas": [
                                            640
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Abra primeiro a sessão."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/painel/{id}/fechar": {
            "post": {
                "tags": [
                    "Painel cirúrgico"
                ],
                "operationId": "m6PainelFechar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "summary": "Fechar a sessão (definitivo)",
                "description": "Definitivo: depois de fechada, a sessão já não aceita registos. Exige \"confirmacao\" igual ao número da cirurgia (sem distinguir maiúsculas; 422 «validacao»), contagens registadas (422 «sem_contagens») e, quando Definições › Bloco › sinais vitais obrigatórios está ligada, sinais vitais (422 «sinais_vitais_em_falta»). Só com a sessão aberta (409). Grava enxertos extraídos e implantados, enxertos por tipo de UF, total de cabelos (da implantação, ou da extração se não houver) e a taxa de transecção; fecha a fase atual e os lotes por implantar; conclui a marcação. Dispara, quando os módulos existem (cada um protegido — o fecho nunca falha por eles; resultado em «efeitos»: ok | erro | indisponivel): marcos do acompanhamento pós-operatório, honorários da equipa, consumo de stock dos fármacos com artigo e lote, episódio → «pós-operatório» e o webhook cirurgia.fechada. Efeitos: evento clínico na linha do tempo, notificação à equipa e auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "confirmacao": {
                                        "type": "string",
                                        "description": "Número da cirurgia, como segunda confirmação."
                                    }
                                },
                                "required": [
                                    "confirmacao"
                                ]
                            },
                            "example": {
                                "confirmacao": "CIR-2026-0214"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "allOf": [
                                                {
                                                    "$ref": "#/components/schemas/M6Painel"
                                                },
                                                {
                                                    "type": "object",
                                                    "properties": {
                                                        "efeitos": {
                                                            "$ref": "#/components/schemas/M6EfeitosFecho"
                                                        }
                                                    }
                                                }
                                            ]
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "cirurgia": {
                                            "id": 214,
                                            "numero": "CIR-2026-0214",
                                            "estado": "concluida",
                                            "estado_rotulo": "Concluída",
                                            "estado_tom": "neutro",
                                            "paciente_id": 1204,
                                            "paciente_nome": "Rui Almeida",
                                            "sala_nome": "Bloco 1",
                                            "tecnica": "FUE",
                                            "inicio_previsto": "2026-11-18T08:30:00+00:00",
                                            "inicio_real": "2026-11-18T08:41:00+00:00",
                                            "fim_real": "2026-11-18T14:05:00+00:00",
                                            "fase_atual": "alta",
                                            "pausada": false,
                                            "pausada_em": null,
                                            "decorrido_seg": 14100,
                                            "peso_kg": 80,
                                            "consentimento": true
                                        },
                                        "fases": [
                                            {
                                                "fase": "admissao",
                                                "rotulo": "Admissão",
                                                "duracao_seg": 900,
                                                "inicio": "2026-11-18T08:41:00+00:00",
                                                "fim": "2026-11-18T08:56:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "desenho",
                                                "rotulo": "Desenho",
                                                "duracao_seg": 1200,
                                                "inicio": "2026-11-18T08:56:00+00:00",
                                                "fim": "2026-11-18T09:16:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "anestesia",
                                                "rotulo": "Anestesia",
                                                "duracao_seg": 600,
                                                "inicio": "2026-11-18T09:16:00+00:00",
                                                "fim": "2026-11-18T09:26:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "extracao",
                                                "rotulo": "Extração",
                                                "duracao_seg": 6900,
                                                "inicio": "2026-11-18T09:26:00+00:00",
                                                "fim": "2026-11-18T11:26:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "implantacao",
                                                "rotulo": "Implantação",
                                                "duracao_seg": 4500,
                                                "inicio": "2026-11-18T11:26:00+00:00",
                                                "fim": null,
                                                "atual": true,
                                                "feita": false
                                            },
                                            {
                                                "fase": "penso",
                                                "rotulo": "Penso",
                                                "duracao_seg": 0,
                                                "inicio": null,
                                                "fim": null,
                                                "atual": false,
                                                "feita": false
                                            },
                                            {
                                                "fase": "alta",
                                                "rotulo": "Alta",
                                                "duracao_seg": 0,
                                                "inicio": null,
                                                "fim": null,
                                                "atual": false,
                                                "feita": false
                                            }
                                        ],
                                        "equipa": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "operadores": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "contagens": {
                                            "extracao": {
                                                "por_tipo": {
                                                    "1": 410,
                                                    "2": 1260,
                                                    "3": 820,
                                                    "4": 140
                                                },
                                                "total": 2630,
                                                "cabelos": 5950,
                                                "cabelos_por_enxerto": 2.26
                                            },
                                            "implantacao": {
                                                "por_tipo": {
                                                    "1": 380,
                                                    "2": 1100,
                                                    "3": 700,
                                                    "4": 120
                                                },
                                                "total": 2300,
                                                "cabelos": 5160,
                                                "cabelos_por_enxerto": 2.24
                                            },
                                            "por_operador": [
                                                {
                                                    "operador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "cor": "#7A4E9C",
                                                    "extracao": 2630,
                                                    "implantacao": 0,
                                                    "por_tipo": {
                                                        "1": 410,
                                                        "2": 1260,
                                                        "3": 820,
                                                        "4": 140
                                                    },
                                                    "por_hora": 780
                                                },
                                                {
                                                    "operador_id": 15,
                                                    "nome": "Marta Sousa",
                                                    "cor": "#C0743A",
                                                    "extracao": 0,
                                                    "implantacao": 2300,
                                                    "por_tipo": {
                                                        "1": 380,
                                                        "2": 1100,
                                                        "3": 700,
                                                        "4": 120
                                                    },
                                                    "por_hora": 920
                                                }
                                            ]
                                        },
                                        "planeado": 2850,
                                        "progresso": {
                                            "extraido_pct": 92,
                                            "implantado_pct": 81
                                        },
                                        "ultima_contagem": {
                                            "id": 90412,
                                            "tipo_uf": 2,
                                            "momento": "implantacao",
                                            "operador": "Marta Sousa",
                                            "criado_em": "2026-11-18T12:41:09+00:00"
                                        },
                                        "lotes": [
                                            {
                                                "id": 51,
                                                "lote": "L1",
                                                "quantidade": 600,
                                                "operador": "Inês Valente",
                                                "extraido_em": "2026-11-18T09:50:00+00:00",
                                                "implantado_em": "2026-11-18T11:35:00+00:00",
                                                "horas_fora": 1.75,
                                                "estado": "ok"
                                            },
                                            {
                                                "id": 52,
                                                "lote": "L2",
                                                "quantidade": 700,
                                                "operador": "Inês Valente",
                                                "extraido_em": "2026-11-18T10:30:00+00:00",
                                                "implantado_em": null,
                                                "horas_fora": 2.18,
                                                "estado": "ok"
                                            }
                                        ],
                                        "tempo_fora": {
                                            "alerta_h": 4,
                                            "maximo_h": 6
                                        },
                                        "transeccao": {
                                            "sessao_pct": 3.5,
                                            "amostras": 2,
                                            "observados": 200,
                                            "por_operador": [
                                                {
                                                    "operador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "pct": 3.5,
                                                    "observados": 200
                                                }
                                            ]
                                        },
                                        "plano": {
                                            "id": 318,
                                            "versao": 3,
                                            "tecnica": "FUE",
                                            "enxertos_necessarios": 3200,
                                            "capacidade_sessao": 2850,
                                            "zonas": [
                                                {
                                                    "zona": "linha_frontal",
                                                    "rotulo": "Linha frontal",
                                                    "area_cm2": 15,
                                                    "densidade_alvo": 25,
                                                    "enxertos": 375
                                                },
                                                {
                                                    "zona": "frontal",
                                                    "rotulo": "Frontal",
                                                    "area_cm2": 60,
                                                    "densidade_alvo": 30,
                                                    "enxertos": 1800
                                                }
                                            ]
                                        },
                                        "enfermagem": {
                                            "visivel": true,
                                            "registos": [
                                                {
                                                    "id": 3302,
                                                    "tipo": "sinais_vitais",
                                                    "tipo_rotulo": "Sinais vitais",
                                                    "dados": {
                                                        "tas": 128,
                                                        "tad": 79,
                                                        "fc": 72,
                                                        "spo2": 98
                                                    },
                                                    "texto": "TA 128/79 mmHg · FC 72 bpm · SpO₂ 98 %",
                                                    "autor": "Paulo Matos",
                                                    "registado_em": "2026-11-18T10:00:00+00:00",
                                                    "anulado": false,
                                                    "motivo_anulacao": null
                                                },
                                                {
                                                    "id": 3301,
                                                    "tipo": "farmaco",
                                                    "tipo_rotulo": "Fármaco",
                                                    "dados": {
                                                        "nome": "Lidocaína com adrenalina",
                                                        "dose": 34,
                                                        "unidade": "ml",
                                                        "concentracao_pct": 1,
                                                        "via": "local",
                                                        "hora": "09:05",
                                                        "lote": "LX2291",
                                                        "adrenalina": true,
                                                        "artigo_id": 58
                                                    },
                                                    "texto": "Lidocaína com adrenalina 34,00 ml (1,0 %) · Local · 09:05 · Lote LX2291 · com adrenalina",
                                                    "autor": "Paulo Matos",
                                                    "registado_em": "2026-11-18T09:05:00+00:00",
                                                    "anulado": false,
                                                    "motivo_anulacao": null
                                                }
                                            ],
                                            "lidocaina": {
                                                "mg_total": 340,
                                                "mg_kg": 4.25,
                                                "limite": 7,
                                                "com_adrenalina": true,
                                                "aviso_pct": 80,
                                                "percentagem": 61,
                                                "estado": "ok",
                                                "peso_kg": 80
                                            },
                                            "sinais_vitais": {
                                                "ultimo_em": "2026-11-18T10:00:00+00:00",
                                                "intervalo_min": 60,
                                                "em_atraso": false
                                            },
                                            "dor_ultima": 2,
                                            "vias": [
                                                {
                                                    "valor": "local",
                                                    "rotulo": "Local"
                                                },
                                                {
                                                    "valor": "subcutanea",
                                                    "rotulo": "Subcutânea"
                                                },
                                                {
                                                    "valor": "oral",
                                                    "rotulo": "Oral"
                                                }
                                            ],
                                            "unidades": [
                                                "mg",
                                                "ml",
                                                "mcg",
                                                "UI",
                                                "g"
                                            ]
                                        },
                                        "checklists": [
                                            {
                                                "id": 611,
                                                "nome": "Verificação de segurança antes da cirurgia",
                                                "fase": "pre_operatorio",
                                                "fase_rotulo": "Pré-operatório",
                                                "estado": "concluida",
                                                "itens": [
                                                    {
                                                        "texto": "Identidade do paciente confirmada",
                                                        "responsavel_papel": "enfermeiro",
                                                        "obrigatorio": true,
                                                        "feito": true,
                                                        "feito_por": 19,
                                                        "feito_por_nome": "Paulo Matos",
                                                        "feito_em": "2026-11-17T16:20:00+00:00"
                                                    },
                                                    {
                                                        "texto": "Análises pré-operatórias revistas",
                                                        "responsavel_papel": "cirurgiao",
                                                        "obrigatorio": true,
                                                        "feito": false,
                                                        "feito_por": null,
                                                        "feito_por_nome": null,
                                                        "feito_em": null
                                                    },
                                                    {
                                                        "texto": "Fotografias pré-operatórias tiradas",
                                                        "responsavel_papel": "tecnico",
                                                        "obrigatorio": false,
                                                        "feito": false,
                                                        "feito_por": null,
                                                        "feito_por_nome": null,
                                                        "feito_em": null
                                                    }
                                                ],
                                                "feitos": 3,
                                                "total": 3,
                                                "concluida_em": "2026-11-18T08:20:00+00:00"
                                            }
                                        ],
                                        "alta": null,
                                        "permissoes": {
                                            "registar": false,
                                            "abrir": false,
                                            "fechar": false,
                                            "enfermagem": false
                                        },
                                        "voz_palavras": {
                                            "1": [
                                                "um",
                                                "uma",
                                                "one",
                                                "uno",
                                                "un",
                                                "eins",
                                                "1"
                                            ],
                                            "2": [
                                                "dois",
                                                "duas",
                                                "two",
                                                "dos",
                                                "deux",
                                                "zwei",
                                                "2"
                                            ],
                                            "3": [
                                                "três",
                                                "tres",
                                                "three",
                                                "trois",
                                                "drei",
                                                "3"
                                            ],
                                            "4": [
                                                "quatro",
                                                "four",
                                                "cuatro",
                                                "quatre",
                                                "vier",
                                                "4"
                                            ],
                                            "desfazer": [
                                                "desfazer",
                                                "anular",
                                                "undo",
                                                "deshacer",
                                                "annuler",
                                                "rückgängig"
                                            ]
                                        },
                                        "atualizado_em": "2026-11-18T12:41:12+00:00",
                                        "efeitos": {
                                            "marcos": "ok",
                                            "honorarios": "ok",
                                            "stock": "ok",
                                            "episodio": "ok",
                                            "webhook": "ok"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "A sessão já está fechada."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Regra de negócio (validacao, sem_contagens, sinais_vitais_em_falta)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "validacao": {
                                        "summary": "validacao",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "validacao",
                                                "mensagem": "Escreva o número da cirurgia (CIR-2026-0214) para confirmar.",
                                                "campos": {
                                                    "confirmacao": "Escreva o número da cirurgia (CIR-2026-0214) para confirmar."
                                                }
                                            }
                                        }
                                    },
                                    "sem_contagens": {
                                        "summary": "sem_contagens",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "sem_contagens",
                                                "mensagem": "Não há contagens: registe os enxertos antes de fechar."
                                            }
                                        }
                                    },
                                    "sinais_vitais_em_falta": {
                                        "summary": "sinais_vitais_em_falta",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "sinais_vitais_em_falta",
                                                "mensagem": "Registe os sinais vitais antes de fechar."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/painel/{id}/foto": {
            "post": {
                "tags": [
                    "Painel cirúrgico"
                ],
                "operationId": "m6PainelFoto",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "summary": "Fotografia intraoperatória",
                "description": "Só com a sessão aberta (409). Exige acesso à ficha clínica do paciente ou «ficha.fotografias» editar. Imagem validada pelo conteúdo, guardada como ficheiro clínico cifrado e ligada à galeria clínica (aceite) quando o módulo de planeamento existe. Com zona ou nota, cria também uma nota de enfermagem. Devolve uma ligação assinada de 15 minutos.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ficheiro"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary"
                                    },
                                    "zona": {
                                        "type": "string",
                                        "pattern": "^[a-z_]{2,30}$",
                                        "description": "Zona do couro cabeludo (ex.: linha_frontal, coroa, dadora_occipital)."
                                    },
                                    "nota": {
                                        "type": "string",
                                        "maxLength": 4000
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6FicheiroLigacao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ficheiro_id": 7802,
                                        "url": "https://clinica.pt/api/v1/ficheiros/7802/conteudo?assinatura=8b1d0e&expira=1795432800"
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Abra primeiro a sessão."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/painel/{id}/implantar": {
            "post": {
                "tags": [
                    "Painel cirúrgico"
                ],
                "operationId": "m6PainelImplantarLote",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "summary": "Lote implantado",
                "description": "Termina o tempo fora do corpo do lote (a primeira hora registada mantém-se) e permite corrigir a quantidade (0 a 5000). Lote inexistente → 404. Sessão aberta (409). No fecho, os lotes por implantar fecham com a hora do fecho.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "lote_id": {
                                        "type": "integer"
                                    },
                                    "quantidade": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "minimum": 0,
                                        "maximum": 5000,
                                        "x-unidade": "enxertos"
                                    }
                                },
                                "required": [
                                    "lote_id"
                                ]
                            },
                            "example": {
                                "lote_id": 52,
                                "quantidade": 690
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Painel"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "cirurgia": {
                                            "id": 214,
                                            "numero": "CIR-2026-0214",
                                            "estado": "em_curso",
                                            "estado_rotulo": "Em curso",
                                            "estado_tom": "marca",
                                            "paciente_id": 1204,
                                            "paciente_nome": "Rui Almeida",
                                            "sala_nome": "Bloco 1",
                                            "tecnica": "FUE",
                                            "inicio_previsto": "2026-11-18T08:30:00+00:00",
                                            "inicio_real": "2026-11-18T08:41:00+00:00",
                                            "fim_real": null,
                                            "fase_atual": "implantacao",
                                            "pausada": false,
                                            "pausada_em": null,
                                            "decorrido_seg": 14100,
                                            "peso_kg": 80,
                                            "consentimento": true
                                        },
                                        "fases": [
                                            {
                                                "fase": "admissao",
                                                "rotulo": "Admissão",
                                                "duracao_seg": 900,
                                                "inicio": "2026-11-18T08:41:00+00:00",
                                                "fim": "2026-11-18T08:56:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "desenho",
                                                "rotulo": "Desenho",
                                                "duracao_seg": 1200,
                                                "inicio": "2026-11-18T08:56:00+00:00",
                                                "fim": "2026-11-18T09:16:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "anestesia",
                                                "rotulo": "Anestesia",
                                                "duracao_seg": 600,
                                                "inicio": "2026-11-18T09:16:00+00:00",
                                                "fim": "2026-11-18T09:26:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "extracao",
                                                "rotulo": "Extração",
                                                "duracao_seg": 6900,
                                                "inicio": "2026-11-18T09:26:00+00:00",
                                                "fim": "2026-11-18T11:26:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "implantacao",
                                                "rotulo": "Implantação",
                                                "duracao_seg": 4500,
                                                "inicio": "2026-11-18T11:26:00+00:00",
                                                "fim": null,
                                                "atual": true,
                                                "feita": false
                                            },
                                            {
                                                "fase": "penso",
                                                "rotulo": "Penso",
                                                "duracao_seg": 0,
                                                "inicio": null,
                                                "fim": null,
                                                "atual": false,
                                                "feita": false
                                            },
                                            {
                                                "fase": "alta",
                                                "rotulo": "Alta",
                                                "duracao_seg": 0,
                                                "inicio": null,
                                                "fim": null,
                                                "atual": false,
                                                "feita": false
                                            }
                                        ],
                                        "equipa": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "operadores": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "contagens": {
                                            "extracao": {
                                                "por_tipo": {
                                                    "1": 410,
                                                    "2": 1260,
                                                    "3": 820,
                                                    "4": 140
                                                },
                                                "total": 2630,
                                                "cabelos": 5950,
                                                "cabelos_por_enxerto": 2.26
                                            },
                                            "implantacao": {
                                                "por_tipo": {
                                                    "1": 380,
                                                    "2": 1100,
                                                    "3": 700,
                                                    "4": 120
                                                },
                                                "total": 2300,
                                                "cabelos": 5160,
                                                "cabelos_por_enxerto": 2.24
                                            },
                                            "por_operador": [
                                                {
                                                    "operador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "cor": "#7A4E9C",
                                                    "extracao": 2630,
                                                    "implantacao": 0,
                                                    "por_tipo": {
                                                        "1": 410,
                                                        "2": 1260,
                                                        "3": 820,
                                                        "4": 140
                                                    },
                                                    "por_hora": 780
                                                },
                                                {
                                                    "operador_id": 15,
                                                    "nome": "Marta Sousa",
                                                    "cor": "#C0743A",
                                                    "extracao": 0,
                                                    "implantacao": 2300,
                                                    "por_tipo": {
                                                        "1": 380,
                                                        "2": 1100,
                                                        "3": 700,
                                                        "4": 120
                                                    },
                                                    "por_hora": 920
                                                }
                                            ]
                                        },
                                        "planeado": 2850,
                                        "progresso": {
                                            "extraido_pct": 92,
                                            "implantado_pct": 81
                                        },
                                        "ultima_contagem": {
                                            "id": 90412,
                                            "tipo_uf": 2,
                                            "momento": "implantacao",
                                            "operador": "Marta Sousa",
                                            "criado_em": "2026-11-18T12:41:09+00:00"
                                        },
                                        "lotes": [
                                            {
                                                "id": 51,
                                                "lote": "L1",
                                                "quantidade": 600,
                                                "operador": "Inês Valente",
                                                "extraido_em": "2026-11-18T09:50:00+00:00",
                                                "implantado_em": "2026-11-18T11:35:00+00:00",
                                                "horas_fora": 1.75,
                                                "estado": "ok"
                                            },
                                            {
                                                "id": 52,
                                                "lote": "L2",
                                                "quantidade": 700,
                                                "operador": "Inês Valente",
                                                "extraido_em": "2026-11-18T10:30:00+00:00",
                                                "implantado_em": null,
                                                "horas_fora": 2.18,
                                                "estado": "ok"
                                            }
                                        ],
                                        "tempo_fora": {
                                            "alerta_h": 4,
                                            "maximo_h": 6
                                        },
                                        "transeccao": {
                                            "sessao_pct": 3.5,
                                            "amostras": 2,
                                            "observados": 200,
                                            "por_operador": [
                                                {
                                                    "operador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "pct": 3.5,
                                                    "observados": 200
                                                }
                                            ]
                                        },
                                        "plano": {
                                            "id": 318,
                                            "versao": 3,
                                            "tecnica": "FUE",
                                            "enxertos_necessarios": 3200,
                                            "capacidade_sessao": 2850,
                                            "zonas": [
                                                {
                                                    "zona": "linha_frontal",
                                                    "rotulo": "Linha frontal",
                                                    "area_cm2": 15,
                                                    "densidade_alvo": 25,
                                                    "enxertos": 375
                                                },
                                                {
                                                    "zona": "frontal",
                                                    "rotulo": "Frontal",
                                                    "area_cm2": 60,
                                                    "densidade_alvo": 30,
                                                    "enxertos": 1800
                                                }
                                            ]
                                        },
                                        "enfermagem": {
                                            "visivel": true,
                                            "registos": [
                                                {
                                                    "id": 3302,
                                                    "tipo": "sinais_vitais",
                                                    "tipo_rotulo": "Sinais vitais",
                                                    "dados": {
                                                        "tas": 128,
                                                        "tad": 79,
                                                        "fc": 72,
                                                        "spo2": 98
                                                    },
                                                    "texto": "TA 128/79 mmHg · FC 72 bpm · SpO₂ 98 %",
                                                    "autor": "Paulo Matos",
                                                    "registado_em": "2026-11-18T10:00:00+00:00",
                                                    "anulado": false,
                                                    "motivo_anulacao": null
                                                },
                                                {
                                                    "id": 3301,
                                                    "tipo": "farmaco",
                                                    "tipo_rotulo": "Fármaco",
                                                    "dados": {
                                                        "nome": "Lidocaína com adrenalina",
                                                        "dose": 34,
                                                        "unidade": "ml",
                                                        "concentracao_pct": 1,
                                                        "via": "local",
                                                        "hora": "09:05",
                                                        "lote": "LX2291",
                                                        "adrenalina": true,
                                                        "artigo_id": 58
                                                    },
                                                    "texto": "Lidocaína com adrenalina 34,00 ml (1,0 %) · Local · 09:05 · Lote LX2291 · com adrenalina",
                                                    "autor": "Paulo Matos",
                                                    "registado_em": "2026-11-18T09:05:00+00:00",
                                                    "anulado": false,
                                                    "motivo_anulacao": null
                                                }
                                            ],
                                            "lidocaina": {
                                                "mg_total": 340,
                                                "mg_kg": 4.25,
                                                "limite": 7,
                                                "com_adrenalina": true,
                                                "aviso_pct": 80,
                                                "percentagem": 61,
                                                "estado": "ok",
                                                "peso_kg": 80
                                            },
                                            "sinais_vitais": {
                                                "ultimo_em": "2026-11-18T10:00:00+00:00",
                                                "intervalo_min": 60,
                                                "em_atraso": false
                                            },
                                            "dor_ultima": 2,
                                            "vias": [
                                                {
                                                    "valor": "local",
                                                    "rotulo": "Local"
                                                },
                                                {
                                                    "valor": "subcutanea",
                                                    "rotulo": "Subcutânea"
                                                },
                                                {
                                                    "valor": "oral",
                                                    "rotulo": "Oral"
                                                }
                                            ],
                                            "unidades": [
                                                "mg",
                                                "ml",
                                                "mcg",
                                                "UI",
                                                "g"
                                            ]
                                        },
                                        "checklists": [
                                            {
                                                "id": 611,
                                                "nome": "Verificação de segurança antes da cirurgia",
                                                "fase": "pre_operatorio",
                                                "fase_rotulo": "Pré-operatório",
                                                "estado": "concluida",
                                                "itens": [
                                                    {
                                                        "texto": "Identidade do paciente confirmada",
                                                        "responsavel_papel": "enfermeiro",
                                                        "obrigatorio": true,
                                                        "feito": true,
                                                        "feito_por": 19,
                                                        "feito_por_nome": "Paulo Matos",
                                                        "feito_em": "2026-11-17T16:20:00+00:00"
                                                    },
                                                    {
                                                        "texto": "Análises pré-operatórias revistas",
                                                        "responsavel_papel": "cirurgiao",
                                                        "obrigatorio": true,
                                                        "feito": false,
                                                        "feito_por": null,
                                                        "feito_por_nome": null,
                                                        "feito_em": null
                                                    },
                                                    {
                                                        "texto": "Fotografias pré-operatórias tiradas",
                                                        "responsavel_papel": "tecnico",
                                                        "obrigatorio": false,
                                                        "feito": false,
                                                        "feito_por": null,
                                                        "feito_por_nome": null,
                                                        "feito_em": null
                                                    }
                                                ],
                                                "feitos": 3,
                                                "total": 3,
                                                "concluida_em": "2026-11-18T08:20:00+00:00"
                                            }
                                        ],
                                        "alta": null,
                                        "permissoes": {
                                            "registar": true,
                                            "abrir": false,
                                            "fechar": true,
                                            "enfermagem": true
                                        },
                                        "voz_palavras": {
                                            "1": [
                                                "um",
                                                "uma",
                                                "one",
                                                "uno",
                                                "un",
                                                "eins",
                                                "1"
                                            ],
                                            "2": [
                                                "dois",
                                                "duas",
                                                "two",
                                                "dos",
                                                "deux",
                                                "zwei",
                                                "2"
                                            ],
                                            "3": [
                                                "três",
                                                "tres",
                                                "three",
                                                "trois",
                                                "drei",
                                                "3"
                                            ],
                                            "4": [
                                                "quatro",
                                                "four",
                                                "cuatro",
                                                "quatre",
                                                "vier",
                                                "4"
                                            ],
                                            "desfazer": [
                                                "desfazer",
                                                "anular",
                                                "undo",
                                                "deshacer",
                                                "annuler",
                                                "rückgängig"
                                            ]
                                        },
                                        "atualizado_em": "2026-11-18T12:41:12+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Abra primeiro a sessão."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/painel/{id}/lote": {
            "post": {
                "tags": [
                    "Painel cirúrgico"
                ],
                "operationId": "m6PainelNovoLote",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "summary": "Novo lote extraído",
                "description": "Cria o lote seguinte (L1, L2, …) e inicia o tempo fora do corpo. Sessão aberta (409). O painel marca o lote com «aviso» ao atingir o alerta e «perigo» ao atingir o máximo das Definições.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "quantidade": {
                                        "type": "integer",
                                        "minimum": 0,
                                        "maximum": 5000,
                                        "x-unidade": "enxertos"
                                    },
                                    "operador_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "quantidade"
                                ]
                            },
                            "example": {
                                "quantidade": 700,
                                "operador_id": 7
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Painel"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "cirurgia": {
                                            "id": 214,
                                            "numero": "CIR-2026-0214",
                                            "estado": "em_curso",
                                            "estado_rotulo": "Em curso",
                                            "estado_tom": "marca",
                                            "paciente_id": 1204,
                                            "paciente_nome": "Rui Almeida",
                                            "sala_nome": "Bloco 1",
                                            "tecnica": "FUE",
                                            "inicio_previsto": "2026-11-18T08:30:00+00:00",
                                            "inicio_real": "2026-11-18T08:41:00+00:00",
                                            "fim_real": null,
                                            "fase_atual": "implantacao",
                                            "pausada": false,
                                            "pausada_em": null,
                                            "decorrido_seg": 14100,
                                            "peso_kg": 80,
                                            "consentimento": true
                                        },
                                        "fases": [
                                            {
                                                "fase": "admissao",
                                                "rotulo": "Admissão",
                                                "duracao_seg": 900,
                                                "inicio": "2026-11-18T08:41:00+00:00",
                                                "fim": "2026-11-18T08:56:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "desenho",
                                                "rotulo": "Desenho",
                                                "duracao_seg": 1200,
                                                "inicio": "2026-11-18T08:56:00+00:00",
                                                "fim": "2026-11-18T09:16:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "anestesia",
                                                "rotulo": "Anestesia",
                                                "duracao_seg": 600,
                                                "inicio": "2026-11-18T09:16:00+00:00",
                                                "fim": "2026-11-18T09:26:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "extracao",
                                                "rotulo": "Extração",
                                                "duracao_seg": 6900,
                                                "inicio": "2026-11-18T09:26:00+00:00",
                                                "fim": "2026-11-18T11:26:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "implantacao",
                                                "rotulo": "Implantação",
                                                "duracao_seg": 4500,
                                                "inicio": "2026-11-18T11:26:00+00:00",
                                                "fim": null,
                                                "atual": true,
                                                "feita": false
                                            },
                                            {
                                                "fase": "penso",
                                                "rotulo": "Penso",
                                                "duracao_seg": 0,
                                                "inicio": null,
                                                "fim": null,
                                                "atual": false,
                                                "feita": false
                                            },
                                            {
                                                "fase": "alta",
                                                "rotulo": "Alta",
                                                "duracao_seg": 0,
                                                "inicio": null,
                                                "fim": null,
                                                "atual": false,
                                                "feita": false
                                            }
                                        ],
                                        "equipa": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "operadores": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "contagens": {
                                            "extracao": {
                                                "por_tipo": {
                                                    "1": 410,
                                                    "2": 1260,
                                                    "3": 820,
                                                    "4": 140
                                                },
                                                "total": 2630,
                                                "cabelos": 5950,
                                                "cabelos_por_enxerto": 2.26
                                            },
                                            "implantacao": {
                                                "por_tipo": {
                                                    "1": 380,
                                                    "2": 1100,
                                                    "3": 700,
                                                    "4": 120
                                                },
                                                "total": 2300,
                                                "cabelos": 5160,
                                                "cabelos_por_enxerto": 2.24
                                            },
                                            "por_operador": [
                                                {
                                                    "operador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "cor": "#7A4E9C",
                                                    "extracao": 2630,
                                                    "implantacao": 0,
                                                    "por_tipo": {
                                                        "1": 410,
                                                        "2": 1260,
                                                        "3": 820,
                                                        "4": 140
                                                    },
                                                    "por_hora": 780
                                                },
                                                {
                                                    "operador_id": 15,
                                                    "nome": "Marta Sousa",
                                                    "cor": "#C0743A",
                                                    "extracao": 0,
                                                    "implantacao": 2300,
                                                    "por_tipo": {
                                                        "1": 380,
                                                        "2": 1100,
                                                        "3": 700,
                                                        "4": 120
                                                    },
                                                    "por_hora": 920
                                                }
                                            ]
                                        },
                                        "planeado": 2850,
                                        "progresso": {
                                            "extraido_pct": 92,
                                            "implantado_pct": 81
                                        },
                                        "ultima_contagem": {
                                            "id": 90412,
                                            "tipo_uf": 2,
                                            "momento": "implantacao",
                                            "operador": "Marta Sousa",
                                            "criado_em": "2026-11-18T12:41:09+00:00"
                                        },
                                        "lotes": [
                                            {
                                                "id": 51,
                                                "lote": "L1",
                                                "quantidade": 600,
                                                "operador": "Inês Valente",
                                                "extraido_em": "2026-11-18T09:50:00+00:00",
                                                "implantado_em": "2026-11-18T11:35:00+00:00",
                                                "horas_fora": 1.75,
                                                "estado": "ok"
                                            },
                                            {
                                                "id": 52,
                                                "lote": "L2",
                                                "quantidade": 700,
                                                "operador": "Inês Valente",
                                                "extraido_em": "2026-11-18T10:30:00+00:00",
                                                "implantado_em": null,
                                                "horas_fora": 2.18,
                                                "estado": "ok"
                                            }
                                        ],
                                        "tempo_fora": {
                                            "alerta_h": 4,
                                            "maximo_h": 6
                                        },
                                        "transeccao": {
                                            "sessao_pct": 3.5,
                                            "amostras": 2,
                                            "observados": 200,
                                            "por_operador": [
                                                {
                                                    "operador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "pct": 3.5,
                                                    "observados": 200
                                                }
                                            ]
                                        },
                                        "plano": {
                                            "id": 318,
                                            "versao": 3,
                                            "tecnica": "FUE",
                                            "enxertos_necessarios": 3200,
                                            "capacidade_sessao": 2850,
                                            "zonas": [
                                                {
                                                    "zona": "linha_frontal",
                                                    "rotulo": "Linha frontal",
                                                    "area_cm2": 15,
                                                    "densidade_alvo": 25,
                                                    "enxertos": 375
                                                },
                                                {
                                                    "zona": "frontal",
                                                    "rotulo": "Frontal",
                                                    "area_cm2": 60,
                                                    "densidade_alvo": 30,
                                                    "enxertos": 1800
                                                }
                                            ]
                                        },
                                        "enfermagem": {
                                            "visivel": true,
                                            "registos": [
                                                {
                                                    "id": 3302,
                                                    "tipo": "sinais_vitais",
                                                    "tipo_rotulo": "Sinais vitais",
                                                    "dados": {
                                                        "tas": 128,
                                                        "tad": 79,
                                                        "fc": 72,
                                                        "spo2": 98
                                                    },
                                                    "texto": "TA 128/79 mmHg · FC 72 bpm · SpO₂ 98 %",
                                                    "autor": "Paulo Matos",
                                                    "registado_em": "2026-11-18T10:00:00+00:00",
                                                    "anulado": false,
                                                    "motivo_anulacao": null
                                                },
                                                {
                                                    "id": 3301,
                                                    "tipo": "farmaco",
                                                    "tipo_rotulo": "Fármaco",
                                                    "dados": {
                                                        "nome": "Lidocaína com adrenalina",
                                                        "dose": 34,
                                                        "unidade": "ml",
                                                        "concentracao_pct": 1,
                                                        "via": "local",
                                                        "hora": "09:05",
                                                        "lote": "LX2291",
                                                        "adrenalina": true,
                                                        "artigo_id": 58
                                                    },
                                                    "texto": "Lidocaína com adrenalina 34,00 ml (1,0 %) · Local · 09:05 · Lote LX2291 · com adrenalina",
                                                    "autor": "Paulo Matos",
                                                    "registado_em": "2026-11-18T09:05:00+00:00",
                                                    "anulado": false,
                                                    "motivo_anulacao": null
                                                }
                                            ],
                                            "lidocaina": {
                                                "mg_total": 340,
                                                "mg_kg": 4.25,
                                                "limite": 7,
                                                "com_adrenalina": true,
                                                "aviso_pct": 80,
                                                "percentagem": 61,
                                                "estado": "ok",
                                                "peso_kg": 80
                                            },
                                            "sinais_vitais": {
                                                "ultimo_em": "2026-11-18T10:00:00+00:00",
                                                "intervalo_min": 60,
                                                "em_atraso": false
                                            },
                                            "dor_ultima": 2,
                                            "vias": [
                                                {
                                                    "valor": "local",
                                                    "rotulo": "Local"
                                                },
                                                {
                                                    "valor": "subcutanea",
                                                    "rotulo": "Subcutânea"
                                                },
                                                {
                                                    "valor": "oral",
                                                    "rotulo": "Oral"
                                                }
                                            ],
                                            "unidades": [
                                                "mg",
                                                "ml",
                                                "mcg",
                                                "UI",
                                                "g"
                                            ]
                                        },
                                        "checklists": [
                                            {
                                                "id": 611,
                                                "nome": "Verificação de segurança antes da cirurgia",
                                                "fase": "pre_operatorio",
                                                "fase_rotulo": "Pré-operatório",
                                                "estado": "concluida",
                                                "itens": [
                                                    {
                                                        "texto": "Identidade do paciente confirmada",
                                                        "responsavel_papel": "enfermeiro",
                                                        "obrigatorio": true,
                                                        "feito": true,
                                                        "feito_por": 19,
                                                        "feito_por_nome": "Paulo Matos",
                                                        "feito_em": "2026-11-17T16:20:00+00:00"
                                                    },
                                                    {
                                                        "texto": "Análises pré-operatórias revistas",
                                                        "responsavel_papel": "cirurgiao",
                                                        "obrigatorio": true,
                                                        "feito": false,
                                                        "feito_por": null,
                                                        "feito_por_nome": null,
                                                        "feito_em": null
                                                    },
                                                    {
                                                        "texto": "Fotografias pré-operatórias tiradas",
                                                        "responsavel_papel": "tecnico",
                                                        "obrigatorio": false,
                                                        "feito": false,
                                                        "feito_por": null,
                                                        "feito_por_nome": null,
                                                        "feito_em": null
                                                    }
                                                ],
                                                "feitos": 3,
                                                "total": 3,
                                                "concluida_em": "2026-11-18T08:20:00+00:00"
                                            }
                                        ],
                                        "alta": null,
                                        "permissoes": {
                                            "registar": true,
                                            "abrir": false,
                                            "fechar": true,
                                            "enfermagem": true
                                        },
                                        "voz_palavras": {
                                            "1": [
                                                "um",
                                                "uma",
                                                "one",
                                                "uno",
                                                "un",
                                                "eins",
                                                "1"
                                            ],
                                            "2": [
                                                "dois",
                                                "duas",
                                                "two",
                                                "dos",
                                                "deux",
                                                "zwei",
                                                "2"
                                            ],
                                            "3": [
                                                "três",
                                                "tres",
                                                "three",
                                                "trois",
                                                "drei",
                                                "3"
                                            ],
                                            "4": [
                                                "quatro",
                                                "four",
                                                "cuatro",
                                                "quatre",
                                                "vier",
                                                "4"
                                            ],
                                            "desfazer": [
                                                "desfazer",
                                                "anular",
                                                "undo",
                                                "deshacer",
                                                "annuler",
                                                "rückgängig"
                                            ]
                                        },
                                        "atualizado_em": "2026-11-18T12:41:12+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Abra primeiro a sessão."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/painel/{id}/motor": {
            "post": {
                "tags": [
                    "Painel cirúrgico"
                ],
                "operationId": "m6PainelMotor",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "summary": "Registar uma leitura do motor de extração",
                "description": "Sessão em curso ou fechada. Valores validados por intervalo (rpm 0–30000, binário 0–100 N·cm, punch 0,3–3 mm, profundidade 0–12 mm, temperatura 0–90 °C). Estado «aviso» ou «falha» notifica a equipa da cirurgia. Registo imutável (anula-se com motivo). Devolve as leituras e os alertas atualizados.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "dados": {
                                        "type": "object",
                                        "properties": {
                                            "equipamento_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "hora": {
                                                "type": "string",
                                                "description": "HH:MM no dia da cirurgia (vazio = agora)."
                                            },
                                            "velocidade_rpm": {
                                                "type": [
                                                    "number",
                                                    "null"
                                                ],
                                                "x-unidade": "rpm"
                                            },
                                            "binario_ncm": {
                                                "type": [
                                                    "number",
                                                    "null"
                                                ],
                                                "x-unidade": "N·cm"
                                            },
                                            "modo": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "enum": [
                                                    "rotacao",
                                                    "oscilacao",
                                                    "vibracao",
                                                    null
                                                ]
                                            },
                                            "punch_mm": {
                                                "type": [
                                                    "number",
                                                    "null"
                                                ],
                                                "x-unidade": "mm"
                                            },
                                            "profundidade_mm": {
                                                "type": [
                                                    "number",
                                                    "null"
                                                ],
                                                "x-unidade": "mm"
                                            },
                                            "temperatura_c": {
                                                "type": [
                                                    "number",
                                                    "null"
                                                ],
                                                "x-unidade": "°C"
                                            },
                                            "estado": {
                                                "type": "string",
                                                "enum": [
                                                    "ok",
                                                    "aviso",
                                                    "falha"
                                                ]
                                            },
                                            "nota": {
                                                "type": "string",
                                                "maxLength": 255
                                            }
                                        }
                                    }
                                },
                                "required": [
                                    "dados"
                                ]
                            },
                            "example": {
                                "dados": {
                                    "equipamento_id": 14,
                                    "hora": "10:42",
                                    "velocidade_rpm": 2800,
                                    "binario_ncm": 12.5,
                                    "modo": "oscilacao",
                                    "punch_mm": 0.85,
                                    "estado": "aviso",
                                    "nota": "Aquecimento da peça de mão"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "motores": {
                                                    "type": "object"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "motores": {
                                            "visivel": true,
                                            "leituras": [],
                                            "alertas": []
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Abra primeiro a sessão."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/painel/{id}/motor_anular": {
            "post": {
                "tags": [
                    "Painel cirúrgico"
                ],
                "operationId": "m6PainelMotorAnular",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "summary": "Anular uma leitura do motor",
                "description": "Com motivo (mínimo 3 caracteres); a leitura fica com autor e motivo da anulação.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "leitura_id": {
                                        "type": "integer"
                                    },
                                    "motivo": {
                                        "type": "string",
                                        "minLength": 3,
                                        "maxLength": 255
                                    }
                                },
                                "required": [
                                    "leitura_id",
                                    "motivo"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "motores": {
                                                    "type": "object"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/painel/{id}/motores/importar": {
            "post": {
                "tags": [
                    "Painel cirúrgico"
                ],
                "operationId": "m6PainelMotoresImportar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "summary": "Importar as leituras do motor (CSV)",
                "description": "CSV exportado pelo motor (até 2 MB, 500 linhas, separador «;» ou «,», primeira linha opcional com os nomes: hora, rpm|velocidade, binario|torque, modo, punch, profundidade, temperatura, estado, nota). Linhas inválidas são ignoradas e contadas. Limite: 10 por 10 minutos.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ficheiro"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary"
                                    },
                                    "equipamento_id": {
                                        "type": "integer"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "importadas": {
                                                    "type": "integer"
                                                },
                                                "ignoradas": {
                                                    "type": "integer"
                                                },
                                                "motores": {
                                                    "type": "object"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "importadas": 42,
                                        "ignoradas": 1,
                                        "motores": {
                                            "visivel": true
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/painel/{id}/pausa": {
            "post": {
                "tags": [
                    "Painel cirúrgico"
                ],
                "operationId": "m6PainelPausa",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "summary": "Pausar ou retomar",
                "description": "Sessão aberta (409). O cronómetro da sessão e o da fase descontam o tempo em pausa. Pedidos repetidos não alteram nada.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "pausar": {
                                        "type": "boolean",
                                        "description": "true pausa; false retoma."
                                    }
                                },
                                "required": [
                                    "pausar"
                                ]
                            },
                            "example": {
                                "pausar": true
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Painel"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "cirurgia": {
                                            "id": 214,
                                            "numero": "CIR-2026-0214",
                                            "estado": "em_curso",
                                            "estado_rotulo": "Em curso",
                                            "estado_tom": "marca",
                                            "paciente_id": 1204,
                                            "paciente_nome": "Rui Almeida",
                                            "sala_nome": "Bloco 1",
                                            "tecnica": "FUE",
                                            "inicio_previsto": "2026-11-18T08:30:00+00:00",
                                            "inicio_real": "2026-11-18T08:41:00+00:00",
                                            "fim_real": null,
                                            "fase_atual": "implantacao",
                                            "pausada": true,
                                            "pausada_em": "2026-11-18T12:45:00+00:00",
                                            "decorrido_seg": 14100,
                                            "peso_kg": 80,
                                            "consentimento": true
                                        },
                                        "fases": [
                                            {
                                                "fase": "admissao",
                                                "rotulo": "Admissão",
                                                "duracao_seg": 900,
                                                "inicio": "2026-11-18T08:41:00+00:00",
                                                "fim": "2026-11-18T08:56:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "desenho",
                                                "rotulo": "Desenho",
                                                "duracao_seg": 1200,
                                                "inicio": "2026-11-18T08:56:00+00:00",
                                                "fim": "2026-11-18T09:16:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "anestesia",
                                                "rotulo": "Anestesia",
                                                "duracao_seg": 600,
                                                "inicio": "2026-11-18T09:16:00+00:00",
                                                "fim": "2026-11-18T09:26:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "extracao",
                                                "rotulo": "Extração",
                                                "duracao_seg": 6900,
                                                "inicio": "2026-11-18T09:26:00+00:00",
                                                "fim": "2026-11-18T11:26:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "implantacao",
                                                "rotulo": "Implantação",
                                                "duracao_seg": 4500,
                                                "inicio": "2026-11-18T11:26:00+00:00",
                                                "fim": null,
                                                "atual": true,
                                                "feita": false
                                            },
                                            {
                                                "fase": "penso",
                                                "rotulo": "Penso",
                                                "duracao_seg": 0,
                                                "inicio": null,
                                                "fim": null,
                                                "atual": false,
                                                "feita": false
                                            },
                                            {
                                                "fase": "alta",
                                                "rotulo": "Alta",
                                                "duracao_seg": 0,
                                                "inicio": null,
                                                "fim": null,
                                                "atual": false,
                                                "feita": false
                                            }
                                        ],
                                        "equipa": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "operadores": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "contagens": {
                                            "extracao": {
                                                "por_tipo": {
                                                    "1": 410,
                                                    "2": 1260,
                                                    "3": 820,
                                                    "4": 140
                                                },
                                                "total": 2630,
                                                "cabelos": 5950,
                                                "cabelos_por_enxerto": 2.26
                                            },
                                            "implantacao": {
                                                "por_tipo": {
                                                    "1": 380,
                                                    "2": 1100,
                                                    "3": 700,
                                                    "4": 120
                                                },
                                                "total": 2300,
                                                "cabelos": 5160,
                                                "cabelos_por_enxerto": 2.24
                                            },
                                            "por_operador": [
                                                {
                                                    "operador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "cor": "#7A4E9C",
                                                    "extracao": 2630,
                                                    "implantacao": 0,
                                                    "por_tipo": {
                                                        "1": 410,
                                                        "2": 1260,
                                                        "3": 820,
                                                        "4": 140
                                                    },
                                                    "por_hora": 780
                                                },
                                                {
                                                    "operador_id": 15,
                                                    "nome": "Marta Sousa",
                                                    "cor": "#C0743A",
                                                    "extracao": 0,
                                                    "implantacao": 2300,
                                                    "por_tipo": {
                                                        "1": 380,
                                                        "2": 1100,
                                                        "3": 700,
                                                        "4": 120
                                                    },
                                                    "por_hora": 920
                                                }
                                            ]
                                        },
                                        "planeado": 2850,
                                        "progresso": {
                                            "extraido_pct": 92,
                                            "implantado_pct": 81
                                        },
                                        "ultima_contagem": {
                                            "id": 90412,
                                            "tipo_uf": 2,
                                            "momento": "implantacao",
                                            "operador": "Marta Sousa",
                                            "criado_em": "2026-11-18T12:41:09+00:00"
                                        },
                                        "lotes": [
                                            {
                                                "id": 51,
                                                "lote": "L1",
                                                "quantidade": 600,
                                                "operador": "Inês Valente",
                                                "extraido_em": "2026-11-18T09:50:00+00:00",
                                                "implantado_em": "2026-11-18T11:35:00+00:00",
                                                "horas_fora": 1.75,
                                                "estado": "ok"
                                            },
                                            {
                                                "id": 52,
                                                "lote": "L2",
                                                "quantidade": 700,
                                                "operador": "Inês Valente",
                                                "extraido_em": "2026-11-18T10:30:00+00:00",
                                                "implantado_em": null,
                                                "horas_fora": 2.18,
                                                "estado": "ok"
                                            }
                                        ],
                                        "tempo_fora": {
                                            "alerta_h": 4,
                                            "maximo_h": 6
                                        },
                                        "transeccao": {
                                            "sessao_pct": 3.5,
                                            "amostras": 2,
                                            "observados": 200,
                                            "por_operador": [
                                                {
                                                    "operador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "pct": 3.5,
                                                    "observados": 200
                                                }
                                            ]
                                        },
                                        "plano": {
                                            "id": 318,
                                            "versao": 3,
                                            "tecnica": "FUE",
                                            "enxertos_necessarios": 3200,
                                            "capacidade_sessao": 2850,
                                            "zonas": [
                                                {
                                                    "zona": "linha_frontal",
                                                    "rotulo": "Linha frontal",
                                                    "area_cm2": 15,
                                                    "densidade_alvo": 25,
                                                    "enxertos": 375
                                                },
                                                {
                                                    "zona": "frontal",
                                                    "rotulo": "Frontal",
                                                    "area_cm2": 60,
                                                    "densidade_alvo": 30,
                                                    "enxertos": 1800
                                                }
                                            ]
                                        },
                                        "enfermagem": {
                                            "visivel": true,
                                            "registos": [
                                                {
                                                    "id": 3302,
                                                    "tipo": "sinais_vitais",
                                                    "tipo_rotulo": "Sinais vitais",
                                                    "dados": {
                                                        "tas": 128,
                                                        "tad": 79,
                                                        "fc": 72,
                                                        "spo2": 98
                                                    },
                                                    "texto": "TA 128/79 mmHg · FC 72 bpm · SpO₂ 98 %",
                                                    "autor": "Paulo Matos",
                                                    "registado_em": "2026-11-18T10:00:00+00:00",
                                                    "anulado": false,
                                                    "motivo_anulacao": null
                                                },
                                                {
                                                    "id": 3301,
                                                    "tipo": "farmaco",
                                                    "tipo_rotulo": "Fármaco",
                                                    "dados": {
                                                        "nome": "Lidocaína com adrenalina",
                                                        "dose": 34,
                                                        "unidade": "ml",
                                                        "concentracao_pct": 1,
                                                        "via": "local",
                                                        "hora": "09:05",
                                                        "lote": "LX2291",
                                                        "adrenalina": true,
                                                        "artigo_id": 58
                                                    },
                                                    "texto": "Lidocaína com adrenalina 34,00 ml (1,0 %) · Local · 09:05 · Lote LX2291 · com adrenalina",
                                                    "autor": "Paulo Matos",
                                                    "registado_em": "2026-11-18T09:05:00+00:00",
                                                    "anulado": false,
                                                    "motivo_anulacao": null
                                                }
                                            ],
                                            "lidocaina": {
                                                "mg_total": 340,
                                                "mg_kg": 4.25,
                                                "limite": 7,
                                                "com_adrenalina": true,
                                                "aviso_pct": 80,
                                                "percentagem": 61,
                                                "estado": "ok",
                                                "peso_kg": 80
                                            },
                                            "sinais_vitais": {
                                                "ultimo_em": "2026-11-18T10:00:00+00:00",
                                                "intervalo_min": 60,
                                                "em_atraso": false
                                            },
                                            "dor_ultima": 2,
                                            "vias": [
                                                {
                                                    "valor": "local",
                                                    "rotulo": "Local"
                                                },
                                                {
                                                    "valor": "subcutanea",
                                                    "rotulo": "Subcutânea"
                                                },
                                                {
                                                    "valor": "oral",
                                                    "rotulo": "Oral"
                                                }
                                            ],
                                            "unidades": [
                                                "mg",
                                                "ml",
                                                "mcg",
                                                "UI",
                                                "g"
                                            ]
                                        },
                                        "checklists": [
                                            {
                                                "id": 611,
                                                "nome": "Verificação de segurança antes da cirurgia",
                                                "fase": "pre_operatorio",
                                                "fase_rotulo": "Pré-operatório",
                                                "estado": "concluida",
                                                "itens": [
                                                    {
                                                        "texto": "Identidade do paciente confirmada",
                                                        "responsavel_papel": "enfermeiro",
                                                        "obrigatorio": true,
                                                        "feito": true,
                                                        "feito_por": 19,
                                                        "feito_por_nome": "Paulo Matos",
                                                        "feito_em": "2026-11-17T16:20:00+00:00"
                                                    },
                                                    {
                                                        "texto": "Análises pré-operatórias revistas",
                                                        "responsavel_papel": "cirurgiao",
                                                        "obrigatorio": true,
                                                        "feito": false,
                                                        "feito_por": null,
                                                        "feito_por_nome": null,
                                                        "feito_em": null
                                                    },
                                                    {
                                                        "texto": "Fotografias pré-operatórias tiradas",
                                                        "responsavel_papel": "tecnico",
                                                        "obrigatorio": false,
                                                        "feito": false,
                                                        "feito_por": null,
                                                        "feito_por_nome": null,
                                                        "feito_em": null
                                                    }
                                                ],
                                                "feitos": 3,
                                                "total": 3,
                                                "concluida_em": "2026-11-18T08:20:00+00:00"
                                            }
                                        ],
                                        "alta": null,
                                        "permissoes": {
                                            "registar": true,
                                            "abrir": false,
                                            "fechar": true,
                                            "enfermagem": true
                                        },
                                        "voz_palavras": {
                                            "1": [
                                                "um",
                                                "uma",
                                                "one",
                                                "uno",
                                                "un",
                                                "eins",
                                                "1"
                                            ],
                                            "2": [
                                                "dois",
                                                "duas",
                                                "two",
                                                "dos",
                                                "deux",
                                                "zwei",
                                                "2"
                                            ],
                                            "3": [
                                                "três",
                                                "tres",
                                                "three",
                                                "trois",
                                                "drei",
                                                "3"
                                            ],
                                            "4": [
                                                "quatro",
                                                "four",
                                                "cuatro",
                                                "quatre",
                                                "vier",
                                                "4"
                                            ],
                                            "desfazer": [
                                                "desfazer",
                                                "anular",
                                                "undo",
                                                "deshacer",
                                                "annuler",
                                                "rückgängig"
                                            ]
                                        },
                                        "atualizado_em": "2026-11-18T12:41:12+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Abra primeiro a sessão."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/painel/{id}/peso": {
            "post": {
                "tags": [
                    "Painel cirúrgico"
                ],
                "operationId": "m6PainelPeso",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "summary": "Peso do paciente",
                "description": "Entre 25 e 300 kg (uma casa decimal). Necessário para o cálculo da dose acumulada de lidocaína em mg/kg; sem peso, com lidocaína registada, o estado do alerta é «sem_peso». Efeitos: auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "peso_kg": {
                                        "type": "number",
                                        "minimum": 25,
                                        "maximum": 300,
                                        "x-unidade": "kg"
                                    }
                                },
                                "required": [
                                    "peso_kg"
                                ]
                            },
                            "example": {
                                "peso_kg": 80
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Painel"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "cirurgia": {
                                            "id": 214,
                                            "numero": "CIR-2026-0214",
                                            "estado": "em_curso",
                                            "estado_rotulo": "Em curso",
                                            "estado_tom": "marca",
                                            "paciente_id": 1204,
                                            "paciente_nome": "Rui Almeida",
                                            "sala_nome": "Bloco 1",
                                            "tecnica": "FUE",
                                            "inicio_previsto": "2026-11-18T08:30:00+00:00",
                                            "inicio_real": "2026-11-18T08:41:00+00:00",
                                            "fim_real": null,
                                            "fase_atual": "implantacao",
                                            "pausada": false,
                                            "pausada_em": null,
                                            "decorrido_seg": 14100,
                                            "peso_kg": 80,
                                            "consentimento": true
                                        },
                                        "fases": [
                                            {
                                                "fase": "admissao",
                                                "rotulo": "Admissão",
                                                "duracao_seg": 900,
                                                "inicio": "2026-11-18T08:41:00+00:00",
                                                "fim": "2026-11-18T08:56:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "desenho",
                                                "rotulo": "Desenho",
                                                "duracao_seg": 1200,
                                                "inicio": "2026-11-18T08:56:00+00:00",
                                                "fim": "2026-11-18T09:16:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "anestesia",
                                                "rotulo": "Anestesia",
                                                "duracao_seg": 600,
                                                "inicio": "2026-11-18T09:16:00+00:00",
                                                "fim": "2026-11-18T09:26:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "extracao",
                                                "rotulo": "Extração",
                                                "duracao_seg": 6900,
                                                "inicio": "2026-11-18T09:26:00+00:00",
                                                "fim": "2026-11-18T11:26:00+00:00",
                                                "atual": false,
                                                "feita": true
                                            },
                                            {
                                                "fase": "implantacao",
                                                "rotulo": "Implantação",
                                                "duracao_seg": 4500,
                                                "inicio": "2026-11-18T11:26:00+00:00",
                                                "fim": null,
                                                "atual": true,
                                                "feita": false
                                            },
                                            {
                                                "fase": "penso",
                                                "rotulo": "Penso",
                                                "duracao_seg": 0,
                                                "inicio": null,
                                                "fim": null,
                                                "atual": false,
                                                "feita": false
                                            },
                                            {
                                                "fase": "alta",
                                                "rotulo": "Alta",
                                                "duracao_seg": 0,
                                                "inicio": null,
                                                "fim": null,
                                                "atual": false,
                                                "feita": false
                                            }
                                        ],
                                        "equipa": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "operadores": [
                                            {
                                                "utilizador_id": 7,
                                                "nome": "Inês Valente",
                                                "cor": "#7A4E9C",
                                                "papel": "cirurgiao",
                                                "papel_rotulo": "Cirurgião",
                                                "honorarios_valor": 1200
                                            },
                                            {
                                                "utilizador_id": 15,
                                                "nome": "Marta Sousa",
                                                "cor": "#C0743A",
                                                "papel": "assistente",
                                                "papel_rotulo": "Assistente"
                                            },
                                            {
                                                "utilizador_id": 19,
                                                "nome": "Paulo Matos",
                                                "cor": "#3A7BC0",
                                                "papel": "enfermeiro",
                                                "papel_rotulo": "Enfermeiro"
                                            }
                                        ],
                                        "contagens": {
                                            "extracao": {
                                                "por_tipo": {
                                                    "1": 410,
                                                    "2": 1260,
                                                    "3": 820,
                                                    "4": 140
                                                },
                                                "total": 2630,
                                                "cabelos": 5950,
                                                "cabelos_por_enxerto": 2.26
                                            },
                                            "implantacao": {
                                                "por_tipo": {
                                                    "1": 380,
                                                    "2": 1100,
                                                    "3": 700,
                                                    "4": 120
                                                },
                                                "total": 2300,
                                                "cabelos": 5160,
                                                "cabelos_por_enxerto": 2.24
                                            },
                                            "por_operador": [
                                                {
                                                    "operador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "cor": "#7A4E9C",
                                                    "extracao": 2630,
                                                    "implantacao": 0,
                                                    "por_tipo": {
                                                        "1": 410,
                                                        "2": 1260,
                                                        "3": 820,
                                                        "4": 140
                                                    },
                                                    "por_hora": 780
                                                },
                                                {
                                                    "operador_id": 15,
                                                    "nome": "Marta Sousa",
                                                    "cor": "#C0743A",
                                                    "extracao": 0,
                                                    "implantacao": 2300,
                                                    "por_tipo": {
                                                        "1": 380,
                                                        "2": 1100,
                                                        "3": 700,
                                                        "4": 120
                                                    },
                                                    "por_hora": 920
                                                }
                                            ]
                                        },
                                        "planeado": 2850,
                                        "progresso": {
                                            "extraido_pct": 92,
                                            "implantado_pct": 81
                                        },
                                        "ultima_contagem": {
                                            "id": 90412,
                                            "tipo_uf": 2,
                                            "momento": "implantacao",
                                            "operador": "Marta Sousa",
                                            "criado_em": "2026-11-18T12:41:09+00:00"
                                        },
                                        "lotes": [
                                            {
                                                "id": 51,
                                                "lote": "L1",
                                                "quantidade": 600,
                                                "operador": "Inês Valente",
                                                "extraido_em": "2026-11-18T09:50:00+00:00",
                                                "implantado_em": "2026-11-18T11:35:00+00:00",
                                                "horas_fora": 1.75,
                                                "estado": "ok"
                                            },
                                            {
                                                "id": 52,
                                                "lote": "L2",
                                                "quantidade": 700,
                                                "operador": "Inês Valente",
                                                "extraido_em": "2026-11-18T10:30:00+00:00",
                                                "implantado_em": null,
                                                "horas_fora": 2.18,
                                                "estado": "ok"
                                            }
                                        ],
                                        "tempo_fora": {
                                            "alerta_h": 4,
                                            "maximo_h": 6
                                        },
                                        "transeccao": {
                                            "sessao_pct": 3.5,
                                            "amostras": 2,
                                            "observados": 200,
                                            "por_operador": [
                                                {
                                                    "operador_id": 7,
                                                    "nome": "Inês Valente",
                                                    "pct": 3.5,
                                                    "observados": 200
                                                }
                                            ]
                                        },
                                        "plano": {
                                            "id": 318,
                                            "versao": 3,
                                            "tecnica": "FUE",
                                            "enxertos_necessarios": 3200,
                                            "capacidade_sessao": 2850,
                                            "zonas": [
                                                {
                                                    "zona": "linha_frontal",
                                                    "rotulo": "Linha frontal",
                                                    "area_cm2": 15,
                                                    "densidade_alvo": 25,
                                                    "enxertos": 375
                                                },
                                                {
                                                    "zona": "frontal",
                                                    "rotulo": "Frontal",
                                                    "area_cm2": 60,
                                                    "densidade_alvo": 30,
                                                    "enxertos": 1800
                                                }
                                            ]
                                        },
                                        "enfermagem": {
                                            "visivel": true,
                                            "registos": [
                                                {
                                                    "id": 3302,
                                                    "tipo": "sinais_vitais",
                                                    "tipo_rotulo": "Sinais vitais",
                                                    "dados": {
                                                        "tas": 128,
                                                        "tad": 79,
                                                        "fc": 72,
                                                        "spo2": 98
                                                    },
                                                    "texto": "TA 128/79 mmHg · FC 72 bpm · SpO₂ 98 %",
                                                    "autor": "Paulo Matos",
                                                    "registado_em": "2026-11-18T10:00:00+00:00",
                                                    "anulado": false,
                                                    "motivo_anulacao": null
                                                },
                                                {
                                                    "id": 3301,
                                                    "tipo": "farmaco",
                                                    "tipo_rotulo": "Fármaco",
                                                    "dados": {
                                                        "nome": "Lidocaína com adrenalina",
                                                        "dose": 34,
                                                        "unidade": "ml",
                                                        "concentracao_pct": 1,
                                                        "via": "local",
                                                        "hora": "09:05",
                                                        "lote": "LX2291",
                                                        "adrenalina": true,
                                                        "artigo_id": 58
                                                    },
                                                    "texto": "Lidocaína com adrenalina 34,00 ml (1,0 %) · Local · 09:05 · Lote LX2291 · com adrenalina",
                                                    "autor": "Paulo Matos",
                                                    "registado_em": "2026-11-18T09:05:00+00:00",
                                                    "anulado": false,
                                                    "motivo_anulacao": null
                                                }
                                            ],
                                            "lidocaina": {
                                                "mg_total": 340,
                                                "mg_kg": 4.25,
                                                "limite": 7,
                                                "com_adrenalina": true,
                                                "aviso_pct": 80,
                                                "percentagem": 61,
                                                "estado": "ok",
                                                "peso_kg": 80
                                            },
                                            "sinais_vitais": {
                                                "ultimo_em": "2026-11-18T10:00:00+00:00",
                                                "intervalo_min": 60,
                                                "em_atraso": false
                                            },
                                            "dor_ultima": 2,
                                            "vias": [
                                                {
                                                    "valor": "local",
                                                    "rotulo": "Local"
                                                },
                                                {
                                                    "valor": "subcutanea",
                                                    "rotulo": "Subcutânea"
                                                },
                                                {
                                                    "valor": "oral",
                                                    "rotulo": "Oral"
                                                }
                                            ],
                                            "unidades": [
                                                "mg",
                                                "ml",
                                                "mcg",
                                                "UI",
                                                "g"
                                            ]
                                        },
                                        "checklists": [
                                            {
                                                "id": 611,
                                                "nome": "Verificação de segurança antes da cirurgia",
                                                "fase": "pre_operatorio",
                                                "fase_rotulo": "Pré-operatório",
                                                "estado": "concluida",
                                                "itens": [
                                                    {
                                                        "texto": "Identidade do paciente confirmada",
                                                        "responsavel_papel": "enfermeiro",
                                                        "obrigatorio": true,
                                                        "feito": true,
                                                        "feito_por": 19,
                                                        "feito_por_nome": "Paulo Matos",
                                                        "feito_em": "2026-11-17T16:20:00+00:00"
                                                    },
                                                    {
                                                        "texto": "Análises pré-operatórias revistas",
                                                        "responsavel_papel": "cirurgiao",
                                                        "obrigatorio": true,
                                                        "feito": false,
                                                        "feito_por": null,
                                                        "feito_por_nome": null,
                                                        "feito_em": null
                                                    },
                                                    {
                                                        "texto": "Fotografias pré-operatórias tiradas",
                                                        "responsavel_papel": "tecnico",
                                                        "obrigatorio": false,
                                                        "feito": false,
                                                        "feito_por": null,
                                                        "feito_por_nome": null,
                                                        "feito_em": null
                                                    }
                                                ],
                                                "feitos": 3,
                                                "total": 3,
                                                "concluida_em": "2026-11-18T08:20:00+00:00"
                                            }
                                        ],
                                        "alta": null,
                                        "permissoes": {
                                            "registar": true,
                                            "abrir": false,
                                            "fechar": true,
                                            "enfermagem": true
                                        },
                                        "voz_palavras": {
                                            "1": [
                                                "um",
                                                "uma",
                                                "one",
                                                "uno",
                                                "un",
                                                "eins",
                                                "1"
                                            ],
                                            "2": [
                                                "dois",
                                                "duas",
                                                "two",
                                                "dos",
                                                "deux",
                                                "zwei",
                                                "2"
                                            ],
                                            "3": [
                                                "três",
                                                "tres",
                                                "three",
                                                "trois",
                                                "drei",
                                                "3"
                                            ],
                                            "4": [
                                                "quatro",
                                                "four",
                                                "cuatro",
                                                "quatre",
                                                "vier",
                                                "4"
                                            ],
                                            "desfazer": [
                                                "desfazer",
                                                "anular",
                                                "undo",
                                                "deshacer",
                                                "annuler",
                                                "rückgängig"
                                            ]
                                        },
                                        "atualizado_em": "2026-11-18T12:41:12+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/painel/{id}/voz": {
            "post": {
                "tags": [
                    "Painel cirúrgico"
                ],
                "operationId": "m6PainelVoz",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da cirurgia"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "summary": "Contagem por voz (bocado de áudio)",
                "description": "Um bocado curto de áudio (WAV PCM 16 bits, 16 kHz, mono, até ~12 s / 600 KB) captado pelo tablet quando deteta fala. O servidor transcreve com o uso de IA «contagem_voz» (serviço local primeiro; o recurso externo só com o interruptor de dados de pacientes), interpreta as palavras da contagem na língua indicada («um»…«quatro», «simples»…«quádruplo», algarismos, «desfazer») e regista cada uma como contagem com a origem «voz» (até 12 por bocado; frases de conversa e repetições da frase de contexto são ignoradas). O áudio nunca é guardado; «ouvido» só volta quando houve contagens. Erros: 409 sessão não aberta, 503 «voz_indisponivel» (desligada nas Definições ou transcrição por configurar), 422 formato/duração. Falha do serviço de transcrição: 200 com «ok»: false e «erro». Limite: 300 por minuto.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ficheiro"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary",
                                        "description": "WAV 16 kHz mono."
                                    },
                                    "momento": {
                                        "type": "string",
                                        "enum": [
                                            "extracao",
                                            "implantacao"
                                        ]
                                    },
                                    "operador_id": {
                                        "type": "integer"
                                    },
                                    "lote": {
                                        "type": "string",
                                        "maxLength": 20
                                    },
                                    "lingua": {
                                        "type": "string",
                                        "description": "Língua das palavras (pt-PT, pt-BR, en, es, fr, de)."
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ok": {
                                                    "type": "boolean"
                                                },
                                                "ouvido": {
                                                    "type": "string"
                                                },
                                                "comandos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string",
                                                        "enum": [
                                                            "1",
                                                            "2",
                                                            "3",
                                                            "4",
                                                            "desfazer"
                                                        ]
                                                    }
                                                },
                                                "aplicados": {
                                                    "type": "integer"
                                                },
                                                "fornecedor": {
                                                    "type": "string"
                                                },
                                                "erro": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "contagens": {
                                                    "type": "object"
                                                },
                                                "progresso": {
                                                    "type": "object"
                                                },
                                                "ultima_contagem": {
                                                    "type": "object"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ok": true,
                                        "ouvido": "Dois. Dois.",
                                        "comandos": [
                                            "2",
                                            "2"
                                        ],
                                        "aplicados": 2,
                                        "fornecedor": "ollama",
                                        "erro": null,
                                        "contagens": {
                                            "extracao": {
                                                "por_tipo": {
                                                    "1": 120,
                                                    "2": 342,
                                                    "3": 110,
                                                    "4": 12
                                                },
                                                "total": 584,
                                                "cabelos": 1182,
                                                "cabelos_por_enxerto": 2.02
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Abra primeiro a sessão."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/bloco/por-agendar": {
            "get": {
                "tags": [
                    "Mapa de cirurgias"
                ],
                "operationId": "m6CirurgiasPorAgendar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "bloco.mapa",
                "x-anagen-nivel": "ver",
                "summary": "Cirurgias pré-marcadas sem data",
                "description": "Pré-marcadas (proposta aceite com sinal, ou criadas à mão) ainda sem data, por antiguidade (até 100), para arrastar para o mapa.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/M6CirurgiaPorAgendar"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 221,
                                            "numero": "CIR-2026-0221",
                                            "paciente_id": 1311,
                                            "paciente_nome": "Hugo Ferreira",
                                            "tecnica": "DHI",
                                            "enxertos_planeados": 2200,
                                            "sinal_pago": true,
                                            "desde": "2026-10-25T15:42:00+00:00"
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/chat/canais": {
            "get": {
                "tags": [
                    "Chat interno"
                ],
                "operationId": "listarCanais",
                "summary": "Canais da pessoa",
                "description": "Só os canais de que a pessoa é membro (junta-a automaticamente aos do seu departamento), com não lidas, menções e a última mensagem. meta.atualizar_segundos indica o intervalo de atualização.",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "arquivados",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "0",
                                "1"
                            ]
                        },
                        "description": "Incluir arquivados."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Canal"
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "nao_lidas": {
                                                    "type": "integer"
                                                },
                                                "convidado_externo": {
                                                    "type": "boolean"
                                                },
                                                "atualizar_segundos": {
                                                    "type": "integer"
                                                },
                                                "departamentos_geriveis": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    },
                                                    "description": "Departamentos em que a pessoa pode criar canais: todos com o âmbito «todos», os seus com o âmbito «departamento», nenhum nos restantes."
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 7,
                                            "tipo": "departamento",
                                            "tipo_rotulo": "Departamento",
                                            "nome": "Enfermagem",
                                            "nao_lidas": 3,
                                            "mencoes": 1,
                                            "silenciado": false,
                                            "ultima": {
                                                "texto": "O paciente das 14 h chegou.",
                                                "autor_nome": "Ana Sousa",
                                                "em": "2026-10-28T13:58:00+00:00"
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            },
            "post": {
                "tags": [
                    "Chat interno"
                ],
                "operationId": "criarCanal",
                "summary": "Criar canal",
                "description": "Tipos: grupo, paciente (exige ver a identificação do paciente), cirurgia (exige ver o mapa de cirurgias) e departamento (só quem administra o chat). Quem cria fica gestor.",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/NovoCanal"
                            },
                            "example": {
                                "tipo": "paciente",
                                "paciente_id": 41,
                                "membros": [
                                    4,
                                    9,
                                    12
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CanalDetalhe"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/chat/canais/{id}": {
            "get": {
                "tags": [
                    "Chat interno"
                ],
                "operationId": "obterCanal",
                "summary": "Canal com membros e leituras",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CanalDetalhe"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/chat/canais/{id}/arquivar": {
            "post": {
                "tags": [
                    "Chat interno"
                ],
                "operationId": "arquivarCanal",
                "summary": "Arquivar/reativar canal (gestor)",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "arquivar": {
                                        "type": "boolean"
                                    }
                                }
                            },
                            "example": {
                                "arquivar": true
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ok": {
                                                    "type": "boolean"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/chat/canais/{id}/lido": {
            "post": {
                "tags": [
                    "Chat interno"
                ],
                "operationId": "marcarCanalLido",
                "summary": "Confirmar leitura até uma mensagem",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ate"
                                ],
                                "properties": {
                                    "ate": {
                                        "type": "integer"
                                    }
                                }
                            },
                            "example": {
                                "ate": 1204
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ok": {
                                                    "type": "boolean"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/chat/canais/{id}/membros": {
            "post": {
                "tags": [
                    "Chat interno"
                ],
                "operationId": "acrescentarMembros",
                "summary": "Acrescentar membros ou convidado externo",
                "description": "Só o gestor do canal (ou quem administra o chat). Com externo=true a pessoa fica limitada a ESTE canal (409/422 se já estiver noutro).",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "membros"
                                ],
                                "properties": {
                                    "membros": {
                                        "type": "array",
                                        "items": {
                                            "type": "integer"
                                        }
                                    },
                                    "externo": {
                                        "type": "boolean"
                                    }
                                }
                            },
                            "example": {
                                "membros": [
                                    31
                                ],
                                "externo": true
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CanalDetalhe"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/chat/canais/{id}/membros/{utilizador}": {
            "delete": {
                "tags": [
                    "Chat interno"
                ],
                "operationId": "retirarMembro",
                "summary": "Retirar membro (ou sair)",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    },
                    {
                        "name": "utilizador",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Pessoa"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ok": {
                                                    "type": "boolean"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/chat/canais/{id}/mensagens": {
            "get": {
                "tags": [
                    "Chat interno"
                ],
                "operationId": "listarMensagens",
                "summary": "Mensagens (últimas, anteriores ou novas)",
                "description": "Sem parâmetros: as últimas. «antes=<id>»: as anteriores (rolar para cima). «depois=<id>»: as novas e as alteradas nos últimos 2 minutos (atualização). «leituras» dá o último id lido por membro (confirmações de leitura).",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    },
                    {
                        "name": "depois",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Id da última mensagem conhecida."
                    },
                    {
                        "name": "antes",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Id da primeira mensagem conhecida."
                    },
                    {
                        "name": "por_pagina",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "maximum": 100,
                            "default": 40
                        },
                        "description": "Quantas."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/MensagensDoCanal"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "mensagens": [
                                            {
                                                "id": 1204,
                                                "canal_id": 7,
                                                "autor_id": 4,
                                                "autor_nome": "Ana Sousa",
                                                "minha": false,
                                                "sistema": false,
                                                "corpo": "@Inês o paciente das 14 h chegou.",
                                                "apagada": false,
                                                "editada": false,
                                                "mencoes": [
                                                    9
                                                ],
                                                "mencionado": true,
                                                "anexos": [],
                                                "tarefa_id": null,
                                                "lido_por": 3,
                                                "lido_por_todos": false,
                                                "pode_editar": false,
                                                "criado_em": "2026-10-28T13:58:00+00:00"
                                            }
                                        ],
                                        "leituras": {
                                            "4": 1204,
                                            "9": 1198
                                        },
                                        "ha_mais": true
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            },
            "post": {
                "tags": [
                    "Chat interno"
                ],
                "operationId": "enviarMensagem",
                "summary": "Enviar mensagem",
                "description": "Texto até ao limite das Definições e/ou anexos (ids de ficheiros carregados por quem envia em POST /ficheiros com categoria «chat»). «@Nome» menciona membros do canal, que recebem uma notificação sem o texto da mensagem. O corpo é guardado cifrado.",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "corpo": {
                                        "type": "string",
                                        "maxLength": 20000
                                    },
                                    "anexos": {
                                        "type": "array",
                                        "items": {
                                            "type": "integer"
                                        },
                                        "maxItems": 10
                                    },
                                    "responde_a_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "corpo": "@Inês o paciente das 14 h chegou.",
                                "anexos": []
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Mensagem"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 1204,
                                        "canal_id": 7,
                                        "autor_id": 4,
                                        "autor_nome": "Ana Sousa",
                                        "minha": false,
                                        "sistema": false,
                                        "corpo": "@Inês o paciente das 14 h chegou.",
                                        "apagada": false,
                                        "editada": false,
                                        "mencoes": [
                                            9
                                        ],
                                        "mencionado": true,
                                        "anexos": [],
                                        "tarefa_id": null,
                                        "lido_por": 3,
                                        "lido_por_todos": false,
                                        "pode_editar": false,
                                        "criado_em": "2026-10-28T13:58:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/chat/canais/{id}/silenciar": {
            "post": {
                "tags": [
                    "Chat interno"
                ],
                "operationId": "silenciarCanal",
                "summary": "Silenciar/retomar",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "silenciar": {
                                        "type": "boolean"
                                    }
                                }
                            },
                            "example": {
                                "silenciar": true
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CanalDetalhe"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/chat/mensagens/{id}": {
            "put": {
                "tags": [
                    "Chat interno"
                ],
                "operationId": "editarMensagem",
                "summary": "Editar mensagem própria",
                "description": "Dentro do prazo das Definições (15 min por omissão).",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "corpo"
                                ],
                                "properties": {
                                    "corpo": {
                                        "type": "string"
                                    }
                                }
                            },
                            "example": {
                                "corpo": "O paciente das 14 h já está na sala 2."
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Mensagem"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            },
            "delete": {
                "tags": [
                    "Chat interno"
                ],
                "operationId": "apagarMensagem",
                "summary": "Apagar mensagem",
                "description": "A própria ou, sendo gestor do canal, de outra pessoa. O texto é eliminado; fica «Mensagem apagada» e a auditoria.",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ok": {
                                                    "type": "boolean"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/chat/mensagens/{id}/tarefa": {
            "post": {
                "tags": [
                    "Chat interno"
                ],
                "operationId": "criarTarefaDaMensagem",
                "summary": "Criar tarefa a partir da mensagem",
                "description": "A tarefa fica com origem «mensagem», ligada ao paciente/cirurgia do canal; o canal recebe uma mensagem de sistema com a ligação.",
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "titulo": {
                                        "type": "string"
                                    },
                                    "responsavel_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "prazo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date-time"
                                    },
                                    "prioridade": {
                                        "type": "string",
                                        "enum": [
                                            "baixa",
                                            "normal",
                                            "alta",
                                            "urgente"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "responsavel_id": 9,
                                "prioridade": "alta"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 88
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/chat/nao-lidas": {
            "get": {
                "tags": [
                    "Chat interno"
                ],
                "operationId": "contarNaoLidasDoChat",
                "summary": "Total de mensagens por ler",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "nao_lidas": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "nao_lidas": 5
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    }
                }
            }
        },
        "/chat/pessoas": {
            "get": {
                "tags": [
                    "Chat interno"
                ],
                "operationId": "procurarPessoasDoChat",
                "summary": "Pessoas para mencionar ou convidar",
                "description": "Com «canal», só os membros desse canal (menções). Convidados externos só veem o seu canal.",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "q",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Nome.",
                        "example": "Inês"
                    },
                    {
                        "name": "canal",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Canal.",
                        "example": 7
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "integer"
                                                    },
                                                    "nome": {
                                                        "type": "string"
                                                    },
                                                    "perfil": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "cor": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "foto_ficheiro_id": {
                                                        "type": [
                                                            "integer",
                                                            "null"
                                                        ]
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/chat/privado": {
            "post": {
                "tags": [
                    "Chat interno"
                ],
                "operationId": "abrirConversaPrivada",
                "summary": "Abrir (ou criar) conversa privada",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "utilizador_id"
                                ],
                                "properties": {
                                    "utilizador_id": {
                                        "type": "integer"
                                    }
                                }
                            },
                            "example": {
                                "utilizador_id": 9
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CanalDetalhe"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/clinica/catalogo": {
            "get": {
                "tags": [
                    "Consultas"
                ],
                "operationId": "m1CatalogoConsulta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "ver",
                "summary": "Catálogo da consulta",
                "description": "Na língua do pedido: zonas do mapa (polígonos numa caixa 100 × 120, recetoras e dadoras), escalas com os graus e a perda por zona (Norwood, Ludwig, Savin, Sinclair e BASP), tipos de consulta, áreas, técnicas, viabilidades, elegibilidades, papéis da equipa, campos (com ajuda e se são só do médico) e secções do ecrã. Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1CatalogoConsulta"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/clinicas": {
            "get": {
                "tags": [
                    "Sessão"
                ],
                "operationId": "clinicas",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Clínicas disponíveis no seletor",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "integer"
                                                    },
                                                    "nome": {
                                                        "type": "string"
                                                    },
                                                    "atual": {
                                                        "type": "boolean"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "global": {
                                                    "type": "boolean"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    }
                }
            }
        },
        "/comercial/caixa": {
            "get": {
                "tags": [
                    "Caixa"
                ],
                "operationId": "m5CaixaObter",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "ver",
                "parameters": [
                    {
                        "name": "data",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Dia (hoje por omissão)"
                    },
                    {
                        "name": "local_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Local da caixa (com vários locais; por omissão o principal)"
                    }
                ],
                "summary": "Caixa de um dia",
                "description": "Caixa do dia (ou null se não foi aberta), totais esperados por método, movimentos e pagamentos registados.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Caixa"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            },
            "post": {
                "tags": [
                    "Caixa"
                ],
                "operationId": "m5CaixaAbrir",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "summary": "Abrir a caixa de hoje",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "saldo_inicial": {
                                        "type": "number",
                                        "x-unidade": "EUR"
                                    },
                                    "notas": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "local_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "saldo_inicial"
                                ]
                            },
                            "example": {
                                "saldo_inicial": 150
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5CaixaDia"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/caixa/historico": {
            "get": {
                "tags": [
                    "Caixa"
                ],
                "operationId": "m5CaixaHistorico",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "ver",
                "parameters": [
                    {
                        "name": "limite",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 365
                        },
                        "description": "Número de dias"
                    },
                    {
                        "name": "local_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Só as caixas deste local"
                    }
                ],
                "summary": "Histórico de caixas",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/M5CaixaResumo"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/caixa/{id}/fecho": {
            "post": {
                "tags": [
                    "Caixa"
                ],
                "operationId": "m5CaixaFechar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Fechar caixa",
                "description": "Contagem por método (todos os métodos com movimento são obrigatórios). Grava contado e diferença; diferença ≠ 0 notifica a administração. Uma caixa fechada não reabre.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "contagem": {
                                        "type": "object",
                                        "additionalProperties": {
                                            "type": "number",
                                            "x-unidade": "EUR"
                                        }
                                    },
                                    "notas": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "contagem"
                                ]
                            },
                            "example": {
                                "contagem": {
                                    "numerario": 412.5,
                                    "cartao": 1380
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5CaixaDia"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/caixa/{id}/movimentos": {
            "post": {
                "tags": [
                    "Caixa"
                ],
                "operationId": "m5CaixaMovimento",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Reforço ou levantamento",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "tipo": {
                                        "type": "string",
                                        "enum": [
                                            "reforco",
                                            "levantamento"
                                        ]
                                    },
                                    "valor": {
                                        "type": "number",
                                        "x-unidade": "EUR"
                                    },
                                    "motivo": {
                                        "type": "string",
                                        "minLength": 3
                                    }
                                },
                                "required": [
                                    "tipo",
                                    "valor",
                                    "motivo"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/caixa/{id}/pagamentos": {
            "post": {
                "tags": [
                    "Caixa"
                ],
                "operationId": "m5CaixaPagamento",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Registar pagamento presencial",
                "description": "Recebe um pagamento pendente do plano (pagamento_id) ou cria um avulso (paciente_id, tipo, descricao, valor). Métodos presenciais das Definições. Efeitos: pagamento pago na caixa, documento fiscal (emissão automática), comissões, evento pagamento.recebido.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "pagamento_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "paciente_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "tipo": {
                                        "type": "string",
                                        "enum": [
                                            "sinal",
                                            "intercalar",
                                            "restante",
                                            "consulta",
                                            "teleconsulta",
                                            "tratamento",
                                            "outro",
                                            "adiantamento",
                                            "pre_pagamento",
                                            "vale",
                                            "comparticipacao"
                                        ]
                                    },
                                    "descricao": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "valor": {
                                        "type": "number",
                                        "x-unidade": "EUR"
                                    },
                                    "metodo": {
                                        "type": "string",
                                        "enum": [
                                            "numerario",
                                            "cartao",
                                            "transferencia",
                                            "financiamento"
                                        ]
                                    },
                                    "notas": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "metodo"
                                ]
                            },
                            "example": {
                                "pagamento_id": 204,
                                "metodo": "cartao"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Pagamento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/caixa/{id}/reconciliacao": {
            "get": {
                "tags": [
                    "Terminais de pagamento"
                ],
                "operationId": "m5Reconciliacao",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "ver",
                "summary": "Reconciliar os terminais com a caixa",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Reconciliacao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/carteira": {
            "get": {
                "tags": [
                    "Carteira"
                ],
                "operationId": "m5Carteira",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "ver",
                "summary": "Carteira do paciente",
                "parameters": [
                    {
                        "name": "paciente_id",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Paciente"
                    },
                    {
                        "name": "limite",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Movimentos (máx. 500)"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Carteira"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/comercial/carteira/credito": {
            "post": {
                "tags": [
                    "Carteira"
                ],
                "operationId": "m5CarteiraCredito",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "editar",
                "summary": "Conceder crédito",
                "description": "Crédito sem contrapartida em dinheiro: usa-se em pagamentos, nunca se devolve. Motivo obrigatório.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "paciente_id": {
                                        "type": "integer"
                                    },
                                    "valor": {
                                        "type": "number",
                                        "x-unidade": "EUR"
                                    },
                                    "motivo": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "paciente_id",
                                    "valor",
                                    "motivo"
                                ]
                            },
                            "example": {
                                "paciente_id": 12,
                                "valor": 50,
                                "motivo": "Compensação pela sessão remarcada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Carteira"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/carteira/devolucao": {
            "post": {
                "tags": [
                    "Carteira"
                ],
                "operationId": "m5CarteiraDevolucao",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "summary": "Devolver ao paciente",
                "description": "Até ao saldo reembolsável. Numerário sai da caixa aberta do local. Emite notas de crédito sobre as faturas de adiantamento.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "paciente_id": {
                                        "type": "integer"
                                    },
                                    "valor": {
                                        "type": "number",
                                        "x-unidade": "EUR"
                                    },
                                    "metodo": {
                                        "type": "string",
                                        "enum": [
                                            "numerario",
                                            "transferencia",
                                            "cartao"
                                        ]
                                    },
                                    "motivo": {
                                        "type": "string"
                                    },
                                    "local_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "paciente_id",
                                    "valor",
                                    "metodo",
                                    "motivo"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Carteira"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/carteira/movimentos/{id}/estorno": {
            "post": {
                "tags": [
                    "Carteira"
                ],
                "operationId": "m5CarteiraEstorno",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "editar",
                "summary": "Estornar um crédito",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "motivo"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Carteira"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/comercial/comissoes": {
            "get": {
                "tags": [
                    "Comissões e honorários"
                ],
                "operationId": "m5Comissoes",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "ver",
                "parameters": [
                    {
                        "name": "de",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Desde"
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Até"
                    },
                    {
                        "name": "tipo",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "todos",
                                "comissao",
                                "honorario"
                            ]
                        },
                        "description": "Tipo"
                    },
                    {
                        "name": "estado",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "pendente",
                                "prevista",
                                "devida",
                                "paga",
                                "estornada",
                                "devido",
                                "pago"
                            ]
                        },
                        "description": "Estado"
                    },
                    {
                        "name": "utilizador_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Pessoa"
                    }
                ],
                "summary": "Comissões e honorários",
                "description": "Indicadores, linhas, resumo por pessoa e série mensal do pago. Sem financeiro.valores (editar), só os valores próprios.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Comissoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/comissoes/pagar": {
            "post": {
                "tags": [
                    "Comissões e honorários"
                ],
                "operationId": "m5ComissoesPagar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "editar",
                "summary": "Marcar como pagos",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "comissoes": {
                                        "type": "array",
                                        "items": {
                                            "type": "integer"
                                        }
                                    },
                                    "honorarios": {
                                        "type": "array",
                                        "items": {
                                            "type": "integer"
                                        }
                                    },
                                    "referencia": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "comissoes": [
                                    301,
                                    302
                                ],
                                "honorarios": [
                                    77
                                ],
                                "referencia": "TRF 2026-11-30"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "marcados": {
                                                    "type": "integer"
                                                },
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "marcados": 3,
                                        "mensagem": "3 valor(es) marcado(s) como pago(s)."
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/contas/{id}": {
            "get": {
                "tags": [
                    "Contas pagadoras e convenções"
                ],
                "operationId": "m5ContaExtrato",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "ver",
                "summary": "Extrato da conta pagadora",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5ContaExtrato"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/comercial/documentos/{id}/eletronica": {
            "get": {
                "tags": [
                    "Pagamentos"
                ],
                "operationId": "m5DocumentoEletronica",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "ver",
                "summary": "Fatura eletrónica do documento",
                "description": "Estado e o que o programa de faturação ligado faz pela integração (hoje nenhum gera CIUS-PT nem assina o PDF).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "documento": {
                                                    "$ref": "#/components/schemas/M5Documento"
                                                },
                                                "capacidades": {
                                                    "type": "object",
                                                    "properties": {
                                                        "cius_pt": {
                                                            "type": "boolean"
                                                        },
                                                        "pdf_assinado": {
                                                            "type": "boolean"
                                                        },
                                                        "nota": {
                                                            "type": "string"
                                                        },
                                                        "fornecedor": {
                                                            "type": "string"
                                                        }
                                                    }
                                                },
                                                "formatos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            },
            "post": {
                "tags": [
                    "Pagamentos"
                ],
                "operationId": "m5DocumentoEletronicaRegistar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "summary": "Registar a fatura eletrónica entregue",
                "description": "Referência da entrega e/ou o PDF com assinatura qualificada (ficheiro_id de POST /ficheiros, só PDF).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "formato": {
                                        "type": "string",
                                        "enum": [
                                            "cius_pt",
                                            "pdf_assinado"
                                        ]
                                    },
                                    "referencia": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "ficheiro_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "formato"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Documento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/comercial/documentos/{id}/enviar": {
            "post": {
                "tags": [
                    "Pagamentos"
                ],
                "operationId": "m5DocumentoEnviar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Enviar ao paciente por email",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/documentos/{id}/nota-credito": {
            "post": {
                "tags": [
                    "Pagamentos"
                ],
                "operationId": "m5DocumentoNotaCredito",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Emitir nota de crédito",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": "string",
                                        "minLength": 3
                                    },
                                    "valor": {
                                        "type": [
                                            "number",
                                            "null"
                                        ],
                                        "x-unidade": "EUR"
                                    }
                                },
                                "required": [
                                    "motivo"
                                ]
                            },
                            "example": {
                                "motivo": "Reembolso parcial acordado",
                                "valor": 200
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Documento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/documentos/{id}/pdf": {
            "get": {
                "tags": [
                    "Pagamentos"
                ],
                "operationId": "m5DocumentoPdf",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "ver",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "PDF do documento fiscal",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "url": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "description": "Ligação assinada ao PDF do documento."
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/locais": {
            "get": {
                "tags": [
                    "Caixa"
                ],
                "operationId": "m5Locais",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "ver",
                "summary": "Locais ativos da clínica",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "integer"
                                                    },
                                                    "nome": {
                                                        "type": "string"
                                                    },
                                                    "principal": {
                                                        "type": "boolean"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/comercial/pagamentos": {
            "get": {
                "tags": [
                    "Pagamentos"
                ],
                "operationId": "m5PagamentosPlano",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "ver",
                "parameters": [
                    {
                        "name": "paciente_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Paciente"
                    },
                    {
                        "name": "episodio_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Episódio"
                    }
                ],
                "summary": "Plano de pagamentos do paciente ou episódio",
                "description": "Pagamentos, totais (aceite, pago, por pagar, vencido), documentos fiscais, métodos disponíveis e ações permitidas.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5PlanoPagamentos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            },
            "post": {
                "tags": [
                    "Pagamentos"
                ],
                "operationId": "m5PagamentosCriar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "summary": "Criar pagamento",
                "description": "Pagamentos::criar — com metodo eletrónico pede logo ao fornecedor da clínica (MB WAY exige telefone e respeita o limite); com metodo presencial e pago=true exige a caixa aberta.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "paciente_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "episodio_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "proposta_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "tipo": {
                                        "type": "string",
                                        "enum": [
                                            "sinal",
                                            "intercalar",
                                            "restante",
                                            "consulta",
                                            "teleconsulta",
                                            "tratamento",
                                            "outro",
                                            "adiantamento",
                                            "pre_pagamento",
                                            "vale",
                                            "comparticipacao"
                                        ]
                                    },
                                    "descricao": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "valor": {
                                        "type": "number",
                                        "x-unidade": "EUR"
                                    },
                                    "metodo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "enum": [
                                            "mbway",
                                            "multibanco",
                                            "cartao",
                                            "numerario",
                                            "transferencia",
                                            "ligacao",
                                            "financiamento",
                                            "carteira",
                                            "vale",
                                            null
                                        ]
                                    },
                                    "telefone": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "vence_em": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date"
                                    },
                                    "pago": {
                                        "type": "boolean"
                                    },
                                    "notas": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "local_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "tipo",
                                    "valor"
                                ]
                            },
                            "example": {
                                "paciente_id": 12,
                                "tipo": "consulta",
                                "descricao": "Consulta de avaliação",
                                "valor": 80,
                                "metodo": "mbway",
                                "telefone": "912345678"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Pagamento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 204,
                                        "paciente_id": 12,
                                        "episodio_id": 31,
                                        "proposta_id": 57,
                                        "tipo": "sinal",
                                        "tipo_rotulo": "Sinal",
                                        "descricao": "Sinal — PR-2026-0057",
                                        "valor": 1380,
                                        "moeda": "EUR",
                                        "metodo": "mbway",
                                        "metodo_rotulo": "MB WAY",
                                        "estado": "pendente",
                                        "estado_rotulo": "Por pagar",
                                        "mb": null,
                                        "telefone_mascarado": "91*****78",
                                        "ligacao_url": null,
                                        "gateway": "ifthenpay",
                                        "confirmacao": null,
                                        "pedido_em": "2026-11-04T16:21:03+00:00",
                                        "pago_em": null,
                                        "vence_em": "2026-11-11",
                                        "vencido": false,
                                        "caixa_id": null,
                                        "recebido_por": null,
                                        "motivo": null,
                                        "notas": null,
                                        "documento": null,
                                        "acoes": {
                                            "gerar": true,
                                            "marcar_pago": true,
                                            "cancelar": true,
                                            "reembolsar": false,
                                            "faturar": false,
                                            "consultar": true
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/pagamentos/plano": {
            "post": {
                "tags": [
                    "Pagamentos"
                ],
                "operationId": "m5PagamentosPlanoDaProposta",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "summary": "Criar ou ajustar o plano de uma proposta aceite",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "proposta_id": {
                                        "type": "integer"
                                    },
                                    "linhas": {
                                        "type": "array",
                                        "items": {
                                            "type": "object",
                                            "properties": {
                                                "pagamento_id": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                },
                                                "valor": {
                                                    "type": "number",
                                                    "x-unidade": "EUR"
                                                },
                                                "vence_em": {
                                                    "type": "string",
                                                    "format": "date"
                                                }
                                            }
                                        }
                                    }
                                },
                                "required": [
                                    "proposta_id"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/M5Pagamento"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/pagamentos/reparticao": {
            "get": {
                "tags": [
                    "Contas pagadoras e convenções"
                ],
                "operationId": "m5Reparticao",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "ver",
                "summary": "Simular a repartição pagador/paciente",
                "parameters": [
                    {
                        "name": "paciente_id",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Paciente"
                    },
                    {
                        "name": "conta_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Conta pagadora (ou convencao_id)"
                    },
                    {
                        "name": "convencao_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Convenção"
                    },
                    {
                        "name": "procedimento_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Ato (obrigatório nas convenções)"
                    },
                    {
                        "name": "valor",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "number"
                        },
                        "description": "Valor do ato"
                    },
                    {
                        "name": "quantidade",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Quantidade"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Reparticao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/comercial/pagamentos/repartidos": {
            "post": {
                "tags": [
                    "Contas pagadoras e convenções"
                ],
                "operationId": "m5Repartido",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "summary": "Criar as partes do pagador e do paciente",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "paciente_id": {
                                        "type": "integer"
                                    },
                                    "conta_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "convencao_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "procedimento_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "valor": {
                                        "type": [
                                            "number",
                                            "null"
                                        ],
                                        "x-unidade": "EUR"
                                    },
                                    "quantidade": {
                                        "type": "integer"
                                    },
                                    "tipo": {
                                        "type": "string"
                                    },
                                    "descricao": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "metodo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "telefone": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "pago": {
                                        "type": "boolean"
                                    },
                                    "vence_em": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date"
                                    },
                                    "autorizacao": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "episodio_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "local_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "paciente_id"
                                ]
                            },
                            "example": {
                                "paciente_id": 12,
                                "convencao_id": 3,
                                "procedimento_id": 9,
                                "tipo": "tratamento",
                                "metodo": "numerario",
                                "pago": true,
                                "autorizacao": "A-55120"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                },
                                                "grupo": {
                                                    "type": "string"
                                                },
                                                "reparticao": {
                                                    "$ref": "#/components/schemas/M5Reparticao"
                                                },
                                                "pagamentos": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/M5Pagamento"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/pagamentos/saldos": {
            "get": {
                "tags": [
                    "Pagamentos"
                ],
                "operationId": "m5PagamentosSaldos",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "ver",
                "parameters": [
                    {
                        "name": "limite",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 200
                        },
                        "description": "Número de pacientes"
                    },
                    {
                        "name": "local_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Recebimentos só deste local"
                    }
                ],
                "summary": "Saldos em dívida",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "kpis": {
                                                    "type": "object",
                                                    "properties": {
                                                        "por_cobrar": {
                                                            "type": "number",
                                                            "x-unidade": "EUR"
                                                        },
                                                        "vencido": {
                                                            "type": "number",
                                                            "x-unidade": "EUR"
                                                        },
                                                        "recebido_mes": {
                                                            "type": "number",
                                                            "x-unidade": "EUR"
                                                        },
                                                        "documentos_por_resolver": {
                                                            "type": "integer"
                                                        }
                                                    }
                                                },
                                                "saldos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "paciente_id": {
                                                                "type": "integer"
                                                            },
                                                            "nome": {
                                                                "type": "string"
                                                            },
                                                            "n": {
                                                                "type": "integer"
                                                            },
                                                            "pendente": {
                                                                "type": "number",
                                                                "x-unidade": "EUR"
                                                            },
                                                            "vencido": {
                                                                "type": "number",
                                                                "x-unidade": "EUR"
                                                            },
                                                            "proximo": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ],
                                                                "format": "date"
                                                            }
                                                        }
                                                    }
                                                },
                                                "recentes": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/M5Pagamento"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/pagamentos/{id}/cancelar": {
            "post": {
                "tags": [
                    "Pagamentos"
                ],
                "operationId": "m5PagamentoCancelar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Cancelar pagamento por pagar",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": "string",
                                        "minLength": 3
                                    }
                                },
                                "required": [
                                    "motivo"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Pagamento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/pagamentos/{id}/carteira": {
            "post": {
                "tags": [
                    "Carteira"
                ],
                "operationId": "m5PagarComSaldo",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "summary": "Pagar com o saldo da carteira",
                "description": "Sem valor = o máximo possível. Se o saldo não chegar, o pagamento é dividido (parte com saldo + restante por cobrar). Não gera fatura nova.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "valor": {
                                        "type": [
                                            "number",
                                            "null"
                                        ],
                                        "x-unidade": "EUR"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                },
                                                "pagamento": {
                                                    "$ref": "#/components/schemas/M5Pagamento"
                                                },
                                                "carteira": {
                                                    "$ref": "#/components/schemas/M5Carteira"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/comercial/pagamentos/{id}/estado": {
            "get": {
                "tags": [
                    "Pagamentos"
                ],
                "operationId": "m5PagamentoEstado",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "ver",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Consultar o estado no fornecedor",
                "description": "Para pagamentos eletrónicos pendentes pergunta ao fornecedor e aplica o resultado (pago → confirmação «api»). Usado pelo estado ao vivo do MB WAY.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Pagamento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 204,
                                        "paciente_id": 12,
                                        "episodio_id": 31,
                                        "proposta_id": 57,
                                        "tipo": "sinal",
                                        "tipo_rotulo": "Sinal",
                                        "descricao": "Sinal — PR-2026-0057",
                                        "valor": 1380,
                                        "moeda": "EUR",
                                        "metodo": "mbway",
                                        "metodo_rotulo": "MB WAY",
                                        "estado": "pendente",
                                        "estado_rotulo": "Por pagar",
                                        "mb": null,
                                        "telefone_mascarado": "91*****78",
                                        "ligacao_url": null,
                                        "gateway": "ifthenpay",
                                        "confirmacao": null,
                                        "pedido_em": "2026-11-04T16:21:03+00:00",
                                        "pago_em": null,
                                        "vence_em": "2026-11-11",
                                        "vencido": false,
                                        "caixa_id": null,
                                        "recebido_por": null,
                                        "motivo": null,
                                        "notas": null,
                                        "documento": null,
                                        "acoes": {
                                            "gerar": true,
                                            "marcar_pago": true,
                                            "cancelar": true,
                                            "reembolsar": false,
                                            "faturar": false,
                                            "consultar": true
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/pagamentos/{id}/fatura": {
            "post": {
                "tags": [
                    "Pagamentos"
                ],
                "operationId": "m5PagamentoFaturar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Emitir documento fiscal",
                "description": "Faturacao::emitir (idempotente) pelo programa certificado da clínica. Erro do programa → documento «erro» com o motivo e nova tentativa automática.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Documento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/pagamentos/{id}/gerar": {
            "post": {
                "tags": [
                    "Pagamentos"
                ],
                "operationId": "m5PagamentoGerar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Gerar MB WAY, referência ou ligação",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "metodo": {
                                        "type": "string",
                                        "enum": [
                                            "mbway",
                                            "multibanco",
                                            "ligacao"
                                        ]
                                    },
                                    "telefone": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "metodo"
                                ]
                            },
                            "example": {
                                "metodo": "multibanco"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Pagamento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/pagamentos/{id}/marcar-pago": {
            "post": {
                "tags": [
                    "Pagamentos"
                ],
                "operationId": "m5PagamentoMarcarPago",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Marcar como pago",
                "description": "Numerário e cartão exigem a caixa de hoje aberta. Efeitos iguais a um pagamento confirmado.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "metodo": {
                                        "type": "string",
                                        "enum": [
                                            "mbway",
                                            "multibanco",
                                            "cartao",
                                            "numerario",
                                            "transferencia",
                                            "ligacao",
                                            "financiamento",
                                            "carteira",
                                            "vale"
                                        ]
                                    },
                                    "notas": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "local_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "metodo": "transferencia",
                                "notas": "Transferência confirmada no extrato"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Pagamento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/pagamentos/{id}/reembolsar": {
            "post": {
                "tags": [
                    "Pagamentos"
                ],
                "operationId": "m5PagamentoReembolsar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Reembolsar pagamento pago",
                "description": "Efeitos: nota de crédito do documento (quando existe), estorno das comissões da proposta, auditoria. A devolução do dinheiro faz-se fora da plataforma.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": "string",
                                        "minLength": 3
                                    }
                                },
                                "required": [
                                    "motivo"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Pagamento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/pagamentos/{id}/terminal": {
            "post": {
                "tags": [
                    "Terminais de pagamento"
                ],
                "operationId": "m5CobrarNoTerminal",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "summary": "Enviar um pagamento pendente ao terminal",
                "description": "Exige a caixa do dia aberta no local (Definições terminais.exigir_caixa). Devolve o pedido; consulte o estado em /comercial/terminais/pedidos/{id}.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "terminal_id": {
                                        "type": "integer"
                                    }
                                },
                                "required": [
                                    "terminal_id"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5PedidoTerminal"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/pagamentos/{id}/vale": {
            "post": {
                "tags": [
                    "Vales de oferta"
                ],
                "operationId": "m5PagarComVale",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "summary": "Pagar com um vale",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "codigo": {
                                        "type": "string"
                                    },
                                    "valor": {
                                        "type": [
                                            "number",
                                            "null"
                                        ],
                                        "x-unidade": "EUR"
                                    }
                                },
                                "required": [
                                    "codigo"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                },
                                                "pagamento": {
                                                    "$ref": "#/components/schemas/M5Pagamento"
                                                },
                                                "vale": {
                                                    "$ref": "#/components/schemas/M5Vale"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/precos/simular": {
            "get": {
                "tags": [
                    "Propostas"
                ],
                "operationId": "m5PrecosSimular",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "ver",
                "summary": "Simular preço",
                "description": "Precos::calcular sem gravar: base, extras, desconto, IVA, total, total na moeda pedida e preço médio por enxerto.",
                "parameters": [
                    {
                        "name": "procedimento_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Procedimento"
                    },
                    {
                        "name": "tabela_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Tabela"
                    },
                    {
                        "name": "enxertos",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Enxertos"
                    },
                    {
                        "name": "sessoes",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Sessões"
                    },
                    {
                        "name": "quantidade",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "number"
                        },
                        "description": "Quantidade"
                    },
                    {
                        "name": "desconto_pct",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "number"
                        },
                        "description": "Desconto (%)"
                    },
                    {
                        "name": "desconto_valor",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "number"
                        },
                        "description": "Desconto (EUR)"
                    },
                    {
                        "name": "moeda",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Moeda"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Calculo"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "base": 6440,
                                        "extras": 0,
                                        "desconto": 0,
                                        "iva_valor": 0,
                                        "total": 6440,
                                        "moeda": "EUR",
                                        "total_moeda": 6440,
                                        "preco_medio_enxerto": 2.3
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/propostas": {
            "get": {
                "tags": [
                    "Propostas"
                ],
                "operationId": "m5PropostasResumo",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "ver",
                "summary": "Painel e lista de propostas",
                "description": "Indicadores (rascunhos, com o paciente, valor em aberto, vistas, aceites no mês, taxa de aceitação a 90 dias, paradas, descontos por decidir), lista filtrada com paginação, gráfico mensal (séries enviadas e aceites) e funil. Respeita o âmbito (próprios/equipa/todos).",
                "parameters": [
                    {
                        "name": "estado",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "rascunho",
                                "enviada",
                                "vista",
                                "aceite",
                                "recusada",
                                "expirada",
                                "em_aberto",
                                "parada",
                                "desconto_pendente"
                            ]
                        },
                        "description": "Estado ou filtro especial"
                    },
                    {
                        "name": "responsavel_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Responsável"
                    },
                    {
                        "name": "paciente_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Paciente"
                    },
                    {
                        "name": "q",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Número ou título"
                    },
                    {
                        "name": "de",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Criadas desde"
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Criadas até"
                    },
                    {
                        "name": "pagina",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Página"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5ResumoPropostas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "kpis": {
                                            "rascunhos": 3,
                                            "em_aberto": 9,
                                            "valor_em_aberto": 61200,
                                            "vistas": 4,
                                            "aceites_mes": 5,
                                            "taxa_aceitacao_90d": 41.7,
                                            "paradas": 2,
                                            "descontos_pendentes": 1
                                        },
                                        "linhas": [
                                            {
                                                "id": 57,
                                                "numero": "PR-2026-0057",
                                                "titulo": "FUE · 2 800 enxertos",
                                                "estado": "vista",
                                                "estado_rotulo": "Vista",
                                                "total": 6900,
                                                "pessoa": "Ricardo Matos",
                                                "responsavel": "Sara Lopes",
                                                "parada": false,
                                                "validade_ate": "2026-11-27"
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            },
            "post": {
                "tags": [
                    "Propostas"
                ],
                "operationId": "m5PropostasCriar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "editar",
                "summary": "Criar proposta (do plano ou manual)",
                "description": "Com plano_id: Propostas::criarDoPlano — exige o plano aprovado; opções por cenários do plano ou por intensidade (Definições), com cópia do plano e versão dos parâmetros. Sem plano_id: proposta manual com paciente_id ou lead_id e procedimento_id. Efeitos: numeração, histórico, linha do tempo, auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "plano_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "paciente_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "lead_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "episodio_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "procedimento_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "tabela_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "titulo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "enxertos": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "sessoes": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "quantidade": {
                                        "type": [
                                            "number",
                                            "null"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "plano_id": 44
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Proposta"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/propostas/planos": {
            "get": {
                "tags": [
                    "Propostas"
                ],
                "operationId": "m5PropostasPlanos",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "editar",
                "summary": "Planos aprovados do paciente",
                "description": "Resumo dos planos aprovados (versão, técnica, enxertos, sessões, data de aprovação) para criar a proposta. Lista vazia sem o módulo de planeamento.",
                "parameters": [
                    {
                        "name": "paciente_id",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Paciente"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "integer"
                                                    },
                                                    "versao": {
                                                        "type": "integer"
                                                    },
                                                    "tecnica": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "enxertos": {
                                                        "type": "integer"
                                                    },
                                                    "sessoes": {
                                                        "type": "integer"
                                                    },
                                                    "aprovado_em": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ],
                                                        "format": "date-time"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 44,
                                            "versao": 2,
                                            "tecnica": "FUE",
                                            "enxertos": 2800,
                                            "sessoes": 1,
                                            "aprovado_em": "2026-10-30T11:02:00+00:00"
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/propostas/{id}": {
            "get": {
                "tags": [
                    "Propostas"
                ],
                "operationId": "m5PropostaObter",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "ver",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Detalhe da proposta",
                "description": "Tudo o que o editor mostra: opções com cálculo, linhas, extras disponíveis, desconto e limite do perfil, prestações (sinal e simulação), moeda e câmbio, selo, ligação pública (só com editar), PDFs, histórico, ações permitidas e, com financeiro.pagamentos, os pagamentos. margem e custos_internos só com financeiro.valores (todos).",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Proposta"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            },
            "put": {
                "tags": [
                    "Propostas"
                ],
                "operationId": "m5PropostaGravar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Gravar e recalcular (rascunho)",
                "description": "Só em rascunho. O servidor recalcula sempre os valores (Precos::calcular). Desconto acima do limite do perfil fica «pendente» e notifica quem aprova. opcao_nova acrescenta uma opção; opcao_remover retira a opção com essa chave.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "titulo": {
                                        "type": "string"
                                    },
                                    "tabela_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "moeda": {
                                        "type": "string",
                                        "pattern": "^[A-Z]{3}$"
                                    },
                                    "idioma": {
                                        "type": "string",
                                        "enum": [
                                            "pt",
                                            "en"
                                        ]
                                    },
                                    "validade_ate": {
                                        "type": "string",
                                        "format": "date"
                                    },
                                    "opcoes": {
                                        "type": "array",
                                        "items": {
                                            "type": "object",
                                            "properties": {
                                                "chave": {
                                                    "type": "string"
                                                },
                                                "titulo": {
                                                    "type": "string"
                                                },
                                                "titulo_en": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "enxertos": {
                                                    "type": "integer"
                                                },
                                                "sessoes": {
                                                    "type": "integer"
                                                },
                                                "quantidade": {
                                                    "type": "number"
                                                },
                                                "recomendada": {
                                                    "type": "boolean"
                                                }
                                            }
                                        }
                                    },
                                    "extras": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        }
                                    },
                                    "linhas": {
                                        "type": "array",
                                        "items": {
                                            "type": "object",
                                            "required": [
                                                "descricao",
                                                "valor"
                                            ],
                                            "properties": {
                                                "descricao": {
                                                    "type": "string"
                                                },
                                                "quantidade": {
                                                    "type": "number"
                                                },
                                                "valor": {
                                                    "type": "number",
                                                    "x-unidade": "EUR"
                                                },
                                                "iva_taxa": {
                                                    "type": [
                                                        "number",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        }
                                    },
                                    "desconto_pct": {
                                        "type": "number"
                                    },
                                    "desconto_valor": {
                                        "type": "number",
                                        "x-unidade": "EUR"
                                    },
                                    "desconto_motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "prestacoes": {
                                        "type": "integer"
                                    },
                                    "opcao_nova": {
                                        "type": "boolean"
                                    },
                                    "opcao_remover": {
                                        "type": "string"
                                    },
                                    "condicoes": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "notas": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "opcoes": [
                                    {
                                        "chave": "recomendada",
                                        "titulo": "Recomendada",
                                        "enxertos": 2800,
                                        "sessoes": 1,
                                        "quantidade": 1,
                                        "recomendada": true
                                    }
                                ],
                                "desconto_pct": 5,
                                "desconto_motivo": "Campanha de outono",
                                "prestacoes": 6
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Proposta"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/propostas/{id}/aceitar": {
            "post": {
                "tags": [
                    "Propostas"
                ],
                "operationId": "m5PropostaAceitarPresencial",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Aceitação presencial",
                "description": "Assinatura do paciente no aparelho (PNG em data URL). Verifica o selo; guarda a prova (texto aceite, opção, nome, assinatura, IP, dispositivo, impressão digital); cria o plano de pagamentos e as comissões previstas; evento proposta.aceite.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "opcao": {
                                        "type": "string"
                                    },
                                    "nome": {
                                        "type": "string",
                                        "minLength": 3,
                                        "maxLength": 160
                                    },
                                    "assinatura": {
                                        "type": "string",
                                        "pattern": "^data:image/png;base64,",
                                        "description": "PNG em data URL."
                                    },
                                    "prestacoes": {
                                        "type": "integer"
                                    },
                                    "aceitar": {
                                        "const": true
                                    }
                                },
                                "required": [
                                    "opcao",
                                    "nome",
                                    "assinatura",
                                    "aceitar"
                                ]
                            },
                            "example": {
                                "opcao": "recomendada",
                                "nome": "Ricardo Matos",
                                "assinatura": "data:image/png;base64,iVBORw0KGgo…",
                                "prestacoes": 1,
                                "aceitar": true
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Proposta"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/propostas/{id}/anular": {
            "post": {
                "tags": [
                    "Propostas"
                ],
                "operationId": "m5PropostaAnular",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Anular aceitação",
                "description": "Proposta aceite: cancela os pagamentos por pagar, estorna as comissões e volta a «recusada», com o motivo. Os pagamentos já pagos tratam-se por reembolso.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": "string",
                                        "minLength": 3,
                                        "maxLength": 500
                                    }
                                },
                                "required": [
                                    "motivo"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/propostas/{id}/codigo": {
            "post": {
                "tags": [
                    "Propostas"
                ],
                "operationId": "m5PropostaCodigo",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas"
                        ]
                    }
                ],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "editar",
                "summary": "Aplicar um código de desconto",
                "description": "Só em rascunho. O desconto do código substitui o desconto manual; acima do limite de aprovação do código fica «pendente».",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "codigo": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "codigo"
                                ]
                            },
                            "example": {
                                "codigo": "PRIMAVERA10"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/propostas/{id}/codigo/retirar": {
            "post": {
                "tags": [
                    "Propostas"
                ],
                "operationId": "m5PropostaCodigoRetirar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas"
                        ]
                    }
                ],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "editar",
                "summary": "Retirar o código de desconto",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/comercial/propostas/{id}/desconto": {
            "post": {
                "tags": [
                    "Propostas"
                ],
                "operationId": "m5PropostaPedirDesconto",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Aplicar ou pedir desconto",
                "description": "Dentro do limite do perfil aplica-se; acima, fica pendente e notifica quem tem comercial.descontos (aprovar).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "desconto_pct": {
                                        "type": "number"
                                    },
                                    "desconto_valor": {
                                        "type": "number",
                                        "x-unidade": "EUR"
                                    },
                                    "desconto_motivo": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "desconto_motivo"
                                ]
                            },
                            "example": {
                                "desconto_pct": 12,
                                "desconto_motivo": "Segunda sessão no mesmo ano"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Proposta"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/propostas/{id}/desconto/decisao": {
            "post": {
                "tags": [
                    "Propostas"
                ],
                "operationId": "m5PropostaDecidirDesconto",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.descontos:aprovar"
                        ]
                    }
                ],
                "x-anagen-modulo": "comercial.descontos",
                "x-anagen-nivel": "aprovar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Aprovar ou recusar desconto",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "decisao": {
                                        "type": "string",
                                        "enum": [
                                            "aprovar",
                                            "recusar"
                                        ]
                                    },
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "decisao"
                                ]
                            },
                            "example": {
                                "decisao": "aprovar"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Proposta"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/propostas/{id}/enviar": {
            "post": {
                "tags": [
                    "Propostas"
                ],
                "operationId": "m5PropostaEnviar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Enviar ao paciente",
                "description": "Exige a proposta selada. Gera (ou reutiliza) a ligação pessoal, gera os PDFs e envia pelos canais pedidos com o Mensageiro. Primeiro envio → estado «enviada», linha do tempo e evento proposta.enviada.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "canais": {
                                        "type": "array",
                                        "items": {
                                            "type": "string",
                                            "enum": [
                                                "email",
                                                "sms",
                                                "whatsapp"
                                            ]
                                        }
                                    }
                                }
                            },
                            "example": {
                                "canais": [
                                    "email",
                                    "whatsapp"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "envio_ok": {
                                                    "type": "boolean"
                                                },
                                                "ligacao": {
                                                    "type": "string"
                                                },
                                                "canais": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/propostas/{id}/pdf": {
            "get": {
                "tags": [
                    "Propostas"
                ],
                "operationId": "m5PropostaPdf",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "ver",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "name": "idioma",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "pt",
                                "en"
                            ]
                        },
                        "description": "Língua do PDF"
                    }
                ],
                "summary": "PDF da proposta",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "url": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "description": "Ligação assinada ao PDF selado (15 minutos); null antes de selar."
                                                },
                                                "publica": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "impressao": {
                                                    "type": "string",
                                                    "description": "Versão de impressão na web (sessão da equipa)."
                                                },
                                                "selada": {
                                                    "type": "boolean"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/propostas/{id}/reativar": {
            "post": {
                "tags": [
                    "Propostas"
                ],
                "operationId": "m5PropostaReativar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Reativar",
                "description": "Proposta recusada ou expirada volta a rascunho, com nova validade e recalculada com a tabela em vigor.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/propostas/{id}/recusar": {
            "post": {
                "tags": [
                    "Propostas"
                ],
                "operationId": "m5PropostaRecusar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Registar recusa",
                "description": "Efeitos: estado «recusada», histórico, linha do tempo, evento proposta.recusada.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": "string",
                                        "minLength": 3,
                                        "maxLength": 500
                                    }
                                },
                                "required": [
                                    "motivo"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Proposta"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/propostas/{id}/rever": {
            "post": {
                "tags": [
                    "Propostas"
                ],
                "operationId": "m5PropostaRever",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Nova versão para revisão",
                "description": "Proposta enviada ou vista volta a rascunho com versão + 1 e sem selo; a ligação anterior deixa de aceitar respostas.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": "string",
                                        "minLength": 3,
                                        "maxLength": 500
                                    }
                                },
                                "required": [
                                    "motivo"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/propostas/{id}/selar": {
            "post": {
                "tags": [
                    "Propostas"
                ],
                "operationId": "m5PropostaSelar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Selar",
                "description": "Recalcula, exige total > 0 e nenhum desconto por decidir, e grava a impressão digital SHA-256 do conteúdo canónico (opções, linhas, valores, condições, cópia do plano).",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "impressao_digital": {
                                                    "type": "string"
                                                },
                                                "selada_em": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/terminais": {
            "get": {
                "tags": [
                    "Terminais de pagamento"
                ],
                "operationId": "m5Terminais",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "ver",
                "summary": "Terminais prontos a cobrar",
                "parameters": [
                    {
                        "name": "local_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Local (os terminais sem local servem todos)"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/M5Terminal"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/comercial/terminais/cobrancas": {
            "post": {
                "tags": [
                    "Terminais de pagamento"
                ],
                "operationId": "m5CobrancaTerminal",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "summary": "Cobrança nova ao balcão",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "paciente_id": {
                                        "type": "integer"
                                    },
                                    "valor": {
                                        "type": "number",
                                        "x-unidade": "EUR"
                                    },
                                    "tipo": {
                                        "type": "string",
                                        "enum": [
                                            "sinal",
                                            "intercalar",
                                            "restante",
                                            "consulta",
                                            "teleconsulta",
                                            "tratamento",
                                            "outro",
                                            "adiantamento",
                                            "pre_pagamento",
                                            "vale",
                                            "comparticipacao"
                                        ]
                                    },
                                    "descricao": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "terminal_id": {
                                        "type": "integer"
                                    }
                                },
                                "required": [
                                    "paciente_id",
                                    "valor",
                                    "terminal_id"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5PedidoTerminal"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/terminais/pedidos/{id}": {
            "get": {
                "tags": [
                    "Terminais de pagamento"
                ],
                "operationId": "m5PedidoTerminal",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "ver",
                "summary": "Estado ao vivo de uma cobrança",
                "description": "Enquanto «enviado», consulta o fornecedor (no máximo a cada 3 s).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5PedidoTerminal"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/comercial/terminais/pedidos/{id}/cancelar": {
            "post": {
                "tags": [
                    "Terminais de pagamento"
                ],
                "operationId": "m5CancelarPedidoTerminal",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "summary": "Cancelar a cobrança no terminal",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5PedidoTerminal"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/comercial/vales": {
            "post": {
                "tags": [
                    "Vales de oferta"
                ],
                "operationId": "m5ValeEmitir",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "summary": "Vender um vale",
                "description": "Cria o vale (por pagar) e o pagamento da venda. O vale fica ativo quando o pagamento é recebido. O código completo só é devolvido a quem edita pagamentos.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "valor": {
                                        "type": "number",
                                        "x-unidade": "EUR"
                                    },
                                    "validade": {
                                        "type": "string",
                                        "format": "date"
                                    },
                                    "finalidade": {
                                        "type": "string",
                                        "enum": [
                                            "multipla",
                                            "unica"
                                        ]
                                    },
                                    "procedimento_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "comprador_paciente_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "comprador_nome": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "beneficiario_nome": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "beneficiario_paciente_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "mensagem": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "metodo": {
                                        "type": "string",
                                        "enum": [
                                            "numerario",
                                            "cartao",
                                            "transferencia",
                                            "financiamento",
                                            "mbway",
                                            "multibanco",
                                            "ligacao"
                                        ]
                                    },
                                    "pago": {
                                        "type": "boolean"
                                    },
                                    "telefone": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "local_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "valor",
                                    "metodo"
                                ]
                            },
                            "example": {
                                "valor": 100,
                                "finalidade": "multipla",
                                "beneficiario_nome": "Ana",
                                "metodo": "numerario",
                                "pago": true
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                },
                                                "vale": {
                                                    "$ref": "#/components/schemas/M5Vale"
                                                },
                                                "pagamento": {
                                                    "$ref": "#/components/schemas/M5Pagamento"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comercial/vales/consulta": {
            "get": {
                "tags": [
                    "Vales de oferta"
                ],
                "operationId": "m5ValeConsultar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos"
                        ]
                    }
                ],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "ver",
                "summary": "Consultar um vale pelo código",
                "parameters": [
                    {
                        "name": "codigo",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Código do vale"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5Vale"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/comunicados": {
            "get": {
                "tags": [
                    "Comunicados"
                ],
                "operationId": "listarComunicados",
                "summary": "Comunicados dirigidos à pessoa",
                "description": "Publicados, em vigor e dirigidos a todos, ao departamento ou ao perfil de quem pede (quem gere vê todos). Criar e editar: recurso genérico /r/comunicados.",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "filtro",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "todos",
                                "por_ler",
                                "fixados"
                            ],
                            "default": "todos"
                        },
                        "description": "Filtro."
                    },
                    {
                        "name": "q",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Pesquisa no título."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Comunicado"
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "por_ler": {
                                                    "type": "integer"
                                                },
                                                "gerir": {
                                                    "type": "boolean"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 3,
                                            "titulo": "Novo protocolo de esterilização",
                                            "corpo": "<p>A partir de segunda-feira…</p>",
                                            "resumo": "A partir de segunda-feira…",
                                            "publico": "departamento",
                                            "publico_rotulo": "Departamento",
                                            "destino": "enfermagem",
                                            "destino_rotulo": "Enfermagem",
                                            "importancia": "alta",
                                            "exige_leitura": true,
                                            "fixado": true,
                                            "publicado_em": "2026-10-27T08:00:00+00:00",
                                            "expira_em": null,
                                            "lido_em": null,
                                            "por_ler": true,
                                            "estatisticas": {
                                                "lidos": 6,
                                                "total": 9
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/comunicados/{id}": {
            "get": {
                "tags": [
                    "Comunicados"
                ],
                "operationId": "obterComunicado",
                "summary": "Ler comunicado",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Comunicado"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 3,
                                        "titulo": "Novo protocolo de esterilização",
                                        "corpo": "<p>A partir de segunda-feira…</p>",
                                        "resumo": "A partir de segunda-feira…",
                                        "publico": "departamento",
                                        "publico_rotulo": "Departamento",
                                        "destino": "enfermagem",
                                        "destino_rotulo": "Enfermagem",
                                        "importancia": "alta",
                                        "exige_leitura": true,
                                        "fixado": true,
                                        "publicado_em": "2026-10-27T08:00:00+00:00",
                                        "expira_em": null,
                                        "lido_em": null,
                                        "por_ler": true,
                                        "estatisticas": {
                                            "lidos": 6,
                                            "total": 9
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/comunicados/{id}/leituras": {
            "get": {
                "tags": [
                    "Comunicados"
                ],
                "operationId": "leiturasDoComunicado",
                "summary": "Quem leu e quem falta ler (gestão)",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "lidos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "integer"
                                                            },
                                                            "nome": {
                                                                "type": "string"
                                                            },
                                                            "lido_em": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ],
                                                                "format": "date-time"
                                                            },
                                                            "origem": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "por_ler": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "integer"
                                                            },
                                                            "nome": {
                                                                "type": "string"
                                                            },
                                                            "perfil": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/comunicados/{id}/lembrar": {
            "post": {
                "tags": [
                    "Comunicados"
                ],
                "operationId": "lembrarLeituraDoComunicado",
                "summary": "Lembrar quem falta ler",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "pessoas": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "pessoas": 3
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/comunicados/{id}/ler": {
            "post": {
                "tags": [
                    "Comunicados"
                ],
                "operationId": "confirmarLeituraDoComunicado",
                "summary": "Confirmar leitura",
                "description": "Idempotente. Guarda quem, quando, de onde (web/app) e regista na auditoria.",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Comunicado"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/conformidade/assinatura-qualificada": {
            "get": {
                "tags": [
                    "Documentos"
                ],
                "operationId": "m2AssinaturaQualificadaEstado",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "ver",
                "summary": "Estado do serviço da Chave Móvel Digital",
                "description": "Diz se a assinatura com a Chave Móvel Digital está disponível e, se não, o que falta (contrato/credenciais da AMA nas Definições, módulos do servidor, gerador de PDF). Sem credenciais, os pedidos são recusados e nada é enviado.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "disponivel": {
                                                    "type": "boolean"
                                                },
                                                "em_falta": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "ambiente": {
                                                    "type": "string",
                                                    "enum": [
                                                        "preprod",
                                                        "producao"
                                                    ]
                                                },
                                                "ambiente_rotulo": {
                                                    "type": "string"
                                                },
                                                "validade_min": {
                                                    "type": "integer"
                                                },
                                                "mensagem": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "disponivel": false,
                                        "em_falta": [
                                            "inativa",
                                            "sem_aplicacao"
                                        ],
                                        "ambiente": "preprod",
                                        "ambiente_rotulo": "Ambiente de testes",
                                        "validade_min": 5,
                                        "mensagem": "A assinatura com a Chave Móvel Digital precisa do contrato com a AMA…"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/avisos": {
            "get": {
                "tags": [
                    "Proteção de dados"
                ],
                "operationId": "m2AvisosResumo",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "ver",
                "parameters": [
                    {
                        "name": "dias",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 365
                        },
                        "description": "Período das exibições (30 por omissão)."
                    }
                ],
                "summary": "Avisos em vigor por canal e exibições",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "canal": {
                                                        "type": "string"
                                                    },
                                                    "canal_rotulo": {
                                                        "type": "string"
                                                    },
                                                    "em_vigor": {
                                                        "type": "array",
                                                        "items": {
                                                            "type": "object",
                                                            "properties": {
                                                                "idioma": {
                                                                    "type": "string"
                                                                },
                                                                "versao": {
                                                                    "type": "integer"
                                                                },
                                                                "publicado_em": {
                                                                    "type": [
                                                                        "string",
                                                                        "null"
                                                                    ],
                                                                    "format": "date-time"
                                                                }
                                                            }
                                                        }
                                                    },
                                                    "exibicoes": {
                                                        "type": "integer"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/consentimentos/{id}/prova": {
            "get": {
                "tags": [
                    "Consentimentos"
                ],
                "operationId": "m2ConsentimentoProva",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.consentimentos:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.consentimentos",
                "x-anagen-nivel": "ver",
                "summary": "Prova de um consentimento",
                "description": "Texto exato da versão aceite, verificação de integridade (texto_integro), decisão, canal, datas, quem recolheu, dispositivo, IP, impressões digitais, entrega e ligações temporárias (15 min) às imagens das assinaturas. A consulta fica registada como exportação.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do consentimento"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M2Prova"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/documentos": {
            "post": {
                "tags": [
                    "Documentos"
                ],
                "operationId": "m2DocumentosEmitir",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Emitir um documento",
                "description": "Atribui número, código de verificação e impressão digital; o conteúdo fica cifrado; gera o PDF quando o gerador está instalado. Campos adicionais obrigatórios em falta → 422 (campos.{chave}).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "modelo_id": {
                                        "type": "integer"
                                    },
                                    "paciente_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "episodio_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "cirurgia_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "medico_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "campos": {
                                        "type": "object",
                                        "additionalProperties": {
                                            "type": "string"
                                        }
                                    },
                                    "partilhar": {
                                        "type": "boolean"
                                    }
                                },
                                "required": [
                                    "modelo_id"
                                ]
                            },
                            "example": {
                                "modelo_id": 3,
                                "paciente_id": 1204,
                                "episodio_id": 77,
                                "partilhar": true
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M2Documento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 902,
                                        "numero": "DOC-2026-0142",
                                        "titulo": "Instruções pós-operatórias",
                                        "tipo": "instrucoes",
                                        "tipo_rotulo": "Instruções",
                                        "clinico": false,
                                        "paciente_id": 1204,
                                        "episodio_id": 77,
                                        "modelo_id": 3,
                                        "modelo_versao": 1,
                                        "estado": "enviado",
                                        "estado_rotulo": "Enviado para assinatura",
                                        "codigo_verificacao": "K7QM-3XRA",
                                        "url_verificacao": "https://clinica.example/verificar/K7QM-3XRA",
                                        "conteudo_hash": "9f2c…e01a",
                                        "assinatura_tipo": null,
                                        "assinatura_canal": "email",
                                        "assinatura_destino": "r***@example.com",
                                        "assinatura_expira": "2026-10-30T10:00:00+00:00",
                                        "assinado_em": null,
                                        "assinado_nome": null,
                                        "libertado_em": null,
                                        "partilhado_paciente": true,
                                        "enviado_em": "2026-10-28T10:00:00+00:00",
                                        "anulado_em": null,
                                        "anulado_motivo": null,
                                        "tem_pdf": true,
                                        "certificado": null,
                                        "pode_ver_conteudo": true,
                                        "criado_em": "2026-10-28T09:58:00+00:00",
                                        "conteudo": "<p>…</p>",
                                        "em_falta": []
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/documentos/modelos": {
            "get": {
                "tags": [
                    "Documentos"
                ],
                "operationId": "m2DocumentosModelos",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "ver",
                "summary": "Modelos aprovados e campos disponíveis",
                "description": "Modelos aprovados com os campos adicionais pedidos na emissão; meta.campos_disponiveis lista os campos automáticos ({{grupo.campo}} → rótulo).",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/M2ModeloDocumento"
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "campos_disponiveis": {
                                                    "type": "object",
                                                    "additionalProperties": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/documentos/pre-visualizar": {
            "post": {
                "tags": [
                    "Documentos"
                ],
                "operationId": "m2DocumentosPreVisualizar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "summary": "Pré-visualizar um documento",
                "description": "HTML sanitizado com os campos substituídos e a lista dos campos sem dados. Não grava nada. Modelos clínicos exigem acesso clínico ao paciente.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "modelo_id": {
                                        "type": "integer"
                                    },
                                    "paciente_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "episodio_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "cirurgia_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "medico_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "campos": {
                                        "type": "object",
                                        "additionalProperties": {
                                            "type": "string"
                                        }
                                    }
                                },
                                "required": [
                                    "modelo_id"
                                ]
                            },
                            "example": {
                                "modelo_id": 3,
                                "paciente_id": 1204,
                                "campos": {
                                    "observacoes": "Evitar exposição solar 15 dias."
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "html": {
                                                    "type": "string"
                                                },
                                                "em_falta": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "html": "<h2>Instruções pós-operatórias</h2><p>…</p>",
                                        "em_falta": [
                                            "cirurgia.data"
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/documentos/{id}": {
            "get": {
                "tags": [
                    "Documentos"
                ],
                "operationId": "m2DocumentosObter",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "ver",
                "summary": "Documento com certificado e cronologia",
                "description": "O conteúdo só vem quando pode_ver_conteudo (documentos clínicos: acesso clínico ao paciente).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do documento"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M2Documento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 902,
                                        "numero": "DOC-2026-0142",
                                        "titulo": "Instruções pós-operatórias",
                                        "tipo": "instrucoes",
                                        "tipo_rotulo": "Instruções",
                                        "clinico": false,
                                        "paciente_id": 1204,
                                        "episodio_id": 77,
                                        "modelo_id": 3,
                                        "modelo_versao": 1,
                                        "estado": "enviado",
                                        "estado_rotulo": "Enviado para assinatura",
                                        "codigo_verificacao": "K7QM-3XRA",
                                        "url_verificacao": "https://clinica.example/verificar/K7QM-3XRA",
                                        "conteudo_hash": "9f2c…e01a",
                                        "assinatura_tipo": null,
                                        "assinatura_canal": "email",
                                        "assinatura_destino": "r***@example.com",
                                        "assinatura_expira": "2026-10-30T10:00:00+00:00",
                                        "assinado_em": null,
                                        "assinado_nome": null,
                                        "libertado_em": null,
                                        "partilhado_paciente": true,
                                        "enviado_em": "2026-10-28T10:00:00+00:00",
                                        "anulado_em": null,
                                        "anulado_motivo": null,
                                        "tem_pdf": true,
                                        "certificado": null,
                                        "pode_ver_conteudo": true,
                                        "criado_em": "2026-10-28T09:58:00+00:00",
                                        "paciente": {
                                            "id": 1204,
                                            "nome": "Rui Almeida",
                                            "numero": "P-2026-0311",
                                            "tem_email": true,
                                            "tem_telefone": true
                                        },
                                        "assinatura_medico": false,
                                        "eventos": [],
                                        "pode_editar": true
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/documentos/{id}/anular": {
            "post": {
                "tags": [
                    "Documentos"
                ],
                "operationId": "m2DocumentosAnular",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do documento"
                    }
                ],
                "summary": "Anular",
                "description": "O documento continua no arquivo; a verificação pública passa a mostrá-lo como anulado.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": "string",
                                        "minLength": 3,
                                        "maxLength": 500
                                    }
                                },
                                "required": [
                                    "motivo"
                                ]
                            },
                            "example": {
                                "motivo": "Emitido com o episódio errado."
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "estado": {
                                                    "const": "anulado"
                                                },
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "estado": "anulado",
                                        "mensagem": "Documento anulado."
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/documentos/{id}/assinar": {
            "post": {
                "tags": [
                    "Documentos"
                ],
                "operationId": "m2DocumentosAssinar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do documento"
                    }
                ],
                "summary": "Assinar no ecrã (presencial)",
                "description": "Assinatura do titular (e do médico, quando o modelo o pede). Gera o certificado.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "assinatura": {
                                        "type": "string",
                                        "contentEncoding": "base64",
                                        "maxLength": 2800000,
                                        "description": "Imagem PNG da assinatura, em base64 ou «data:image/png;base64,…» (máx. 2 MB)."
                                    },
                                    "nome": {
                                        "type": "string",
                                        "minLength": 3,
                                        "maxLength": 160
                                    },
                                    "assinatura_medico": {
                                        "type": "string",
                                        "contentEncoding": "base64",
                                        "maxLength": 2800000,
                                        "description": "Imagem PNG da assinatura, em base64 ou «data:image/png;base64,…» (máx. 2 MB)."
                                    }
                                },
                                "required": [
                                    "assinatura",
                                    "nome"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M2Documento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/documentos/{id}/cmd": {
            "get": {
                "tags": [
                    "Documentos"
                ],
                "operationId": "m2DocumentosCmdPedidos",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "ver",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do documento"
                    }
                ],
                "summary": "Pedidos de assinatura qualificada do documento",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/M2PedidoCmd"
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "servico": {
                                                    "type": "object"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            },
            "post": {
                "tags": [
                    "Documentos"
                ],
                "operationId": "m2DocumentosCmdIniciar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do documento"
                    }
                ],
                "summary": "Pedir a assinatura com a Chave Móvel Digital",
                "description": "O titular indica o telemóvel e o PIN. A plataforma obtém a cadeia de certificados, prepara o PDF para PAdES, calcula o resumo dos atributos assinados e pede a assinatura ao serviço da AMA, que envia um código por SMS ao titular. O PIN nunca é guardado nem devolvido. Período de reflexão aplicado. Limite: 10 por 10 minutos.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "telemovel": {
                                        "type": "string",
                                        "maxLength": 20
                                    },
                                    "pin": {
                                        "type": "string",
                                        "pattern": "^[0-9]{4,8}$",
                                        "writeOnly": true
                                    }
                                },
                                "required": [
                                    "telemovel",
                                    "pin"
                                ]
                            },
                            "example": {
                                "telemovel": "+351 912345678",
                                "pin": "••••"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M2PedidoCmd"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/documentos/{id}/cmd/{pedido}/cancelar": {
            "post": {
                "tags": [
                    "Documentos"
                ],
                "operationId": "m2DocumentosCmdCancelar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do documento"
                    },
                    {
                        "name": "pedido",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Pedido de assinatura"
                    }
                ],
                "summary": "Cancelar o pedido",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "estado": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 12,
                                        "estado": "cancelado"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/documentos/{id}/cmd/{pedido}/codigo": {
            "post": {
                "tags": [
                    "Documentos"
                ],
                "operationId": "m2DocumentosCmdCodigo",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do documento"
                    },
                    {
                        "name": "pedido",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Pedido de assinatura"
                    }
                ],
                "summary": "Confirmar o código e concluir",
                "description": "Valida o código no serviço, confere a assinatura com o certificado, escreve o contentor CMS no PDF (PAdES, ETSI.CAdES.detached), valida o resultado e guarda-o como a assinatura do documento, com o certificado de conclusão e o consentimento ligado. Até 3 tentativas por pedido.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "codigo": {
                                        "type": "string",
                                        "pattern": "^[0-9]{4,8}$"
                                    }
                                },
                                "required": [
                                    "codigo"
                                ]
                            },
                            "example": {
                                "codigo": "123456"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M2Documento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/documentos/{id}/cmd/{pedido}/sms": {
            "post": {
                "tags": [
                    "Documentos"
                ],
                "operationId": "m2DocumentosCmdSms",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do documento"
                    },
                    {
                        "name": "pedido",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Pedido de assinatura"
                    }
                ],
                "summary": "Reenviar o código por SMS",
                "description": "O telemóvel tem de ser o mesmo do pedido (comparado por índice cego). Limite: 5 por 10 minutos.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "telemovel": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "telemovel"
                                ]
                            },
                            "example": {
                                "telemovel": "+351 912345678"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M2PedidoCmd"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/documentos/{id}/enviar": {
            "post": {
                "tags": [
                    "Documentos"
                ],
                "operationId": "m2DocumentosEnviar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do documento"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Enviar para assinatura com código",
                "description": "Gera uma ligação nova (a anterior deixa de valer) e um código de 6 algarismos enviado em mensagem separada. Validade e tentativas nas Definições.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "canal": {
                                        "type": "string",
                                        "enum": [
                                            "email",
                                            "sms",
                                            "whatsapp"
                                        ]
                                    }
                                },
                                "required": [
                                    "canal"
                                ]
                            },
                            "example": {
                                "canal": "email"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ok": {
                                                    "type": "boolean"
                                                },
                                                "mensagem": {
                                                    "type": "string"
                                                },
                                                "destino": {
                                                    "type": "string"
                                                },
                                                "canal_codigo": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "expira_em": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ok": true,
                                        "mensagem": "Enviado para r***@example.com. O código seguiu numa mensagem separada.",
                                        "destino": "r***@example.com",
                                        "canal_codigo": "sms",
                                        "expira_em": "2026-10-30T10:00:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Ação recusada (acao_recusada)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M2RespostaErro"
                                },
                                "examples": {
                                    "envio_falhou": {
                                        "summary": "envio_falhou",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "acao_recusada",
                                                "mensagem": "Não foi possível enviar: endereço inválido."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/documentos/{id}/partilhar": {
            "post": {
                "tags": [
                    "Documentos"
                ],
                "operationId": "m2DocumentosPartilhar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do documento"
                    }
                ],
                "summary": "Partilhar ou retirar do portal",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "partilhar": {
                                        "type": "boolean"
                                    }
                                },
                                "required": [
                                    "partilhar"
                                ]
                            },
                            "example": {
                                "partilhar": true
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "partilhado_paciente": {
                                                    "type": "boolean"
                                                },
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "partilhado_paciente": true,
                                        "mensagem": "Documento partilhado no portal."
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/documentos/{id}/pdf": {
            "get": {
                "tags": [
                    "Documentos"
                ],
                "operationId": "m2DocumentosPdf",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "ver",
                "summary": "PDF do documento",
                "description": "Com PDF guardado: {tipo: \"pdf\", url (15 min)}. Sem PDF: {tipo: \"html\", html, url_web} para mostrar ou imprimir.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do documento"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "tipo": {
                                                    "type": "string",
                                                    "enum": [
                                                        "pdf",
                                                        "html"
                                                    ]
                                                },
                                                "url": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "expira_em": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                },
                                                "html": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "url_web": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "tipo": "pdf",
                                        "url": "https://clinica.example/ficheiros/…",
                                        "expira_em": "2026-10-28T10:15:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/documentos/{id}/qualificada": {
            "post": {
                "tags": [
                    "Documentos"
                ],
                "operationId": "m2DocumentosQualificada",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do documento"
                    }
                ],
                "summary": "Associar PDF com assinatura qualificada",
                "description": "ficheiro_id de um PDF já carregado em POST /ficheiros. O ficheiro tem de conter uma assinatura digital, que é validada: estrutura, integridade do conteúdo (resumo das partes cobertas), assinatura matemática com o certificado incluído, validade do certificado no momento declarado, declaração de certificado qualificado e coerência da cadeia incluída. Um PDF alterado depois de assinado ou com assinatura que não confere é recusado (422). O resultado fica em certificado.validacao, com a lista do que não se valida aqui (confiança na raiz, revogação, carimbos de tempo).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "ficheiro_id": {
                                        "type": "integer"
                                    }
                                },
                                "required": [
                                    "ficheiro_id"
                                ]
                            },
                            "example": {
                                "ficheiro_id": 7781
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M2Documento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/dpo": {
            "get": {
                "tags": [
                    "Proteção de dados"
                ],
                "operationId": "m2Dpo",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "ver",
                "summary": "Painel do encarregado de proteção de dados",
                "description": "Os mesmos dados do ecrã web: kpis (com ligações web e app), pedidos, reclamações, incidentes (segundos até ao prazo da CNPD), alertas (vazio sem admin.auditoria), subcontratantes, subcontratantes_plataforma (declarados para a plataforma: nome, finalidade, país, transferência internacional, garantias), rat, formacoes, ers, revisao (null sem admin.utilizadores), consentimentos (gráfico por finalidade e decisão, por dia, revogações em 30 dias), equipamentos, modelos_por_aprovar, conservacao e encarregado; permissoes indica as ações disponíveis. Sem dados clínicos.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M2Painel"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/dpo/alertas/detetar": {
            "post": {
                "tags": [
                    "Proteção de dados"
                ],
                "operationId": "m2AlertasDetetar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.auditoria:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "editar",
                "summary": "Detetar acessos anómalos agora",
                "description": "Analisa as últimas 24 h do registo de atividade. criados: número de alertas novos por tipo.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "criados": {
                                                    "type": "object",
                                                    "additionalProperties": {
                                                        "type": "integer"
                                                    }
                                                },
                                                "total": {
                                                    "type": "integer"
                                                },
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "criados": {
                                            "volume": 1,
                                            "fora_horas": 0
                                        },
                                        "total": 1,
                                        "mensagem": "Deteção concluída: 1 alertas novos."
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/dpo/alertas/{id}/rever": {
            "post": {
                "tags": [
                    "Proteção de dados"
                ],
                "operationId": "m2AlertasRever",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.auditoria:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "editar",
                "summary": "Rever um alerta",
                "description": "«injustificado» cria uma tarefa para a administração. Não é possível rever um alerta sobre os próprios acessos.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do alerta"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "decisao": {
                                        "type": "string",
                                        "enum": [
                                            "justificado",
                                            "injustificado",
                                            "falso_positivo"
                                        ]
                                    },
                                    "notas": {
                                        "type": "string",
                                        "maxLength": 2000
                                    }
                                },
                                "required": [
                                    "decisao"
                                ]
                            },
                            "example": {
                                "decisao": "justificado",
                                "notas": "Consulta de rotina do dia."
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "mensagem": "Alerta revisto."
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/dpo/ers/{id}": {
            "post": {
                "tags": [
                    "Proteção de dados"
                ],
                "operationId": "m2ErsConfirmar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "summary": "Confirmar a atualização do registo ERS",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do profissional (utilizador)"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "mensagem": "Registo na ERS confirmado."
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/dpo/revisao": {
            "post": {
                "tags": [
                    "Proteção de dados"
                ],
                "operationId": "m2RevisaoIniciar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "editar",
                "summary": "Iniciar a revisão de acessos",
                "description": "Guarda o instantâneo das permissões efetivas (ou devolve a revisão em curso).",
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 12
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/dpo/revisao/{id}": {
            "get": {
                "tags": [
                    "Proteção de dados"
                ],
                "operationId": "m2RevisaoObter",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "ver",
                "summary": "Revisão com o instantâneo",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da revisão"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M2Revisao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/dpo/revisao/{id}/concluir": {
            "post": {
                "tags": [
                    "Proteção de dados"
                ],
                "operationId": "m2RevisaoConcluir",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "editar",
                "summary": "Concluir a revisão",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da revisão"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "notas": {
                                        "type": "string",
                                        "minLength": 3,
                                        "maxLength": 5000
                                    },
                                    "alteracoes": {
                                        "type": "string",
                                        "maxLength": 5000
                                    }
                                },
                                "required": [
                                    "notas"
                                ]
                            },
                            "example": {
                                "notas": "Acessos conferidos com a direção.",
                                "alteracoes": "Desativada a conta de um técnico sem uso."
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "mensagem": "Revisão concluída."
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/pacientes/{id}/acessos": {
            "get": {
                "tags": [
                    "Proteção de dados"
                ],
                "operationId": "m2QuemAcedeu",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "ver",
                "summary": "Quem acedeu aos dados do paciente",
                "description": "Permissão: admin.auditoria (ver) ou conformidade (editar). Até 1000 registos mais recentes, filtrados; resumo, por dia, pessoas e por ação. A consulta fica registada.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do paciente"
                    },
                    {
                        "name": "f[acao]",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "ver",
                                "criar",
                                "alterar",
                                "apagar",
                                "exportar",
                                "imprimir",
                                "entrar",
                                "sair",
                                "falha_entrada",
                                "acesso_emergencia",
                                "aprovar",
                                "enviar",
                                "assinar",
                                "revogar",
                                "descarregar"
                            ]
                        },
                        "description": "Ação."
                    },
                    {
                        "name": "f[ator]",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Nome da pessoa."
                    },
                    {
                        "name": "f[perfil]",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Chave do perfil."
                    },
                    {
                        "name": "f[origem]",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "web",
                                "api",
                                "gancho",
                                "agendador"
                            ]
                        },
                        "description": "Origem."
                    },
                    {
                        "name": "f[de]",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Desde."
                    },
                    {
                        "name": "f[ate]",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Até."
                    },
                    {
                        "name": "f[emergencia]",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "1"
                            ]
                        },
                        "description": "Só acessos de emergência."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M2Acessos"
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "total": {
                                                    "type": "integer"
                                                },
                                                "filtros": {
                                                    "type": "object"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/pacientes/{id}/avisos": {
            "get": {
                "tags": [
                    "Consentimentos"
                ],
                "operationId": "m2PacienteAvisos",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.consentimentos:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.consentimentos",
                "x-anagen-nivel": "ver",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do paciente"
                    }
                ],
                "summary": "Avisos de privacidade mostrados ao paciente",
                "description": "Versões mostradas por canal (incluindo as mostradas enquanto era um contacto comercial), com a verificação de integridade do texto e da linha.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/M2AvisoMostrado"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/pacientes/{id}/consentimentos": {
            "get": {
                "tags": [
                    "Consentimentos"
                ],
                "operationId": "m2PacienteConsentimentos",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.consentimentos:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.consentimentos",
                "x-anagen-nivel": "ver",
                "summary": "Estado atual por finalidade",
                "description": "Última decisão de cada finalidade do paciente.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do paciente"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "finalidade": {
                                                        "type": "string",
                                                        "enum": [
                                                            "tratamento_clinico",
                                                            "fotografias_clinicas",
                                                            "imagens_comunicacao",
                                                            "captura_3d",
                                                            "gravacao_chamadas",
                                                            "gravacao_video",
                                                            "ia",
                                                            "agente_voz",
                                                            "marketing",
                                                            "partilha_terceiros",
                                                            "teleconsulta",
                                                            "cirurgico",
                                                            "contacto"
                                                        ]
                                                    },
                                                    "finalidade_rotulo": {
                                                        "type": "string"
                                                    },
                                                    "consentimento_id": {
                                                        "type": "integer"
                                                    },
                                                    "decisao": {
                                                        "type": "string",
                                                        "enum": [
                                                            "dado",
                                                            "recusado",
                                                            "revogado"
                                                        ]
                                                    },
                                                    "decisao_rotulo": {
                                                        "type": "string"
                                                    },
                                                    "canal": {
                                                        "type": "string"
                                                    },
                                                    "modelo_id": {
                                                        "type": [
                                                            "integer",
                                                            "null"
                                                        ]
                                                    },
                                                    "versao": {
                                                        "type": [
                                                            "integer",
                                                            "null"
                                                        ]
                                                    },
                                                    "em": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ],
                                                        "format": "date-time"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "finalidade": "fotografias_clinicas",
                                            "finalidade_rotulo": "Fotografias clínicas",
                                            "consentimento_id": 5480,
                                            "decisao": "dado",
                                            "decisao_rotulo": "Dado",
                                            "canal": "presencial",
                                            "modelo_id": 2,
                                            "versao": 1,
                                            "em": "2026-10-10T11:00:00+00:00"
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/reclamacoes/exportar-ers": {
            "get": {
                "tags": [
                    "Proteção de dados"
                ],
                "operationId": "m2ReclamacoesErs",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "exportar",
                "summary": "Exportar reclamações para a ERS (CSV)",
                "description": "Exige permissão de exportação. CSV com «;», UTF-8 com BOM: número, referência do Livro, tipo, canal, categoria, datas, estado e dias úteis até à resposta. Marca as linhas como exportadas.",
                "parameters": [
                    {
                        "name": "de",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Início (inclusive)."
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Fim (inclusive)."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Ficheiro CSV",
                        "content": {
                            "text/csv": {
                                "schema": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/recolha": {
            "get": {
                "tags": [
                    "Consentimentos"
                ],
                "operationId": "m2RecolhaDados",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.consentimentos:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.consentimentos",
                "x-anagen-nivel": "ver",
                "summary": "Dados da recolha para um paciente",
                "description": "Paciente, episódio escolhido e episódios do paciente, aviso de privacidade em vigor (canal «app», ou «portal» como recurso) com a data em que foi mostrado, modelos aprovados aplicáveis na língua do paciente com o estado atual de cada finalidade, a entrega da informação em curso (com segundos até ao fim da reflexão) e, nos cirúrgicos com episódio, a validade e os motivos; médicos que podem assinar. Sem efeitos.",
                "parameters": [
                    {
                        "name": "paciente_id",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Paciente."
                    },
                    {
                        "name": "episodio_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Episódio (para o consentimento cirúrgico)."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M2Recolha"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "paciente": {
                                            "id": 1204,
                                            "numero": "P-2026-0311",
                                            "nome": "Rui Almeida",
                                            "idioma": "pt-PT",
                                            "tem_email": true,
                                            "tem_telefone": true,
                                            "portal_ativo": true
                                        },
                                        "episodio": {
                                            "id": 77,
                                            "numero": "E-2026-0077",
                                            "titulo": "Transplante capilar",
                                            "tecnica": "FUE"
                                        },
                                        "episodios": [
                                            {
                                                "id": 77,
                                                "numero": "E-2026-0077",
                                                "titulo": "Transplante capilar",
                                                "tecnica": "FUE",
                                                "estado": "planeamento"
                                            }
                                        ],
                                        "aviso": {
                                            "id": 6,
                                            "canal": "app",
                                            "versao": 1,
                                            "titulo": "Aviso de privacidade",
                                            "texto": "<p>…</p>",
                                            "visto_em": null
                                        },
                                        "modelos": [
                                            {
                                                "id": 14,
                                                "chave": "cirurgico_fue",
                                                "titulo": "Consentimento informado — FUE",
                                                "finalidade": "cirurgico",
                                                "finalidade_rotulo": "Consentimento cirúrgico",
                                                "base_legal": "consentimento",
                                                "base_legal_rotulo": "Consentimento",
                                                "informativo": false,
                                                "obrigatorio": true,
                                                "escrito": true,
                                                "versao": 2,
                                                "tecnica": "FUE",
                                                "idioma": "pt-PT",
                                                "texto": "<h3>Descrição do ato</h3><p>…</p>",
                                                "reflexao_horas": 48,
                                                "estado_atual": null,
                                                "entrega": {
                                                    "id": 311,
                                                    "modelo_id": 14,
                                                    "modelo_versao": 2,
                                                    "entregue_em": "2026-10-28T10:05:00+00:00",
                                                    "liberta_em": "2026-10-29T10:05:00+00:00",
                                                    "segundos_restantes": 86400,
                                                    "estado": "entregue",
                                                    "documento_id": 902,
                                                    "canal": "app"
                                                },
                                                "cirurgico": {
                                                    "valido": false,
                                                    "motivos": [
                                                        {
                                                            "codigo": "reflexao",
                                                            "texto": "Período de reflexão não cumprido"
                                                        }
                                                    ],
                                                    "plano": {
                                                        "id": 40,
                                                        "versao": 3,
                                                        "aprovado_em": "2026-10-20T16:00:00+00:00"
                                                    }
                                                }
                                            }
                                        ],
                                        "medicos": [
                                            {
                                                "id": 7,
                                                "nome": "Inês Valente",
                                                "cedula": "54321"
                                            }
                                        ],
                                        "agora": "2026-10-28T10:06:00+00:00",
                                        "pode_editar": true
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/recolha/aviso": {
            "post": {
                "tags": [
                    "Consentimentos"
                ],
                "operationId": "m2RecolhaAviso",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.consentimentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.consentimentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Registar que o aviso de privacidade foi mostrado",
                "description": "Guarda a versão do aviso mostrada ao paciente e quando.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "paciente_id": {
                                        "type": "integer"
                                    },
                                    "aviso_id": {
                                        "type": "integer"
                                    },
                                    "canal": {
                                        "type": "string",
                                        "default": "app"
                                    }
                                },
                                "required": [
                                    "paciente_id",
                                    "aviso_id"
                                ]
                            },
                            "example": {
                                "paciente_id": 1204,
                                "aviso_id": 6
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 3120,
                                        "mensagem": "Ficou registado que o aviso de privacidade foi mostrado."
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/recolha/entregar": {
            "post": {
                "tags": [
                    "Consentimentos"
                ],
                "operationId": "m2RecolhaEntregar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.consentimentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.consentimentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Entregar a informação de um modelo",
                "description": "Regista a entrega da informação (texto completo e versão) e inicia o período de reflexão do modelo. Por omissão, a informação fica também como documento no portal do paciente (copia_portal).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "paciente_id": {
                                        "type": "integer"
                                    },
                                    "modelo_id": {
                                        "type": "integer"
                                    },
                                    "episodio_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "plano_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "copia_portal": {
                                        "type": "boolean",
                                        "default": true
                                    }
                                },
                                "required": [
                                    "paciente_id",
                                    "modelo_id"
                                ]
                            },
                            "example": {
                                "paciente_id": 1204,
                                "modelo_id": 14,
                                "episodio_id": 77
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M2Entrega"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 311,
                                        "modelo_id": 14,
                                        "modelo_versao": 2,
                                        "entregue_em": "2026-10-28T10:05:00+00:00",
                                        "liberta_em": "2026-10-29T10:05:00+00:00",
                                        "segundos_restantes": 86400,
                                        "estado": "entregue",
                                        "documento_id": 902,
                                        "canal": "app"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/recolha/enviar": {
            "post": {
                "tags": [
                    "Consentimentos"
                ],
                "operationId": "m2RecolhaEnviar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.consentimentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.consentimentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Enviar para assinar em casa",
                "description": "Entrega a informação, cria o documento e envia ao paciente a ligação pessoal (email, SMS ou WhatsApp) com o código de uso único numa mensagem separada. O período de reflexão aplica-se à ligação.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "paciente_id": {
                                        "type": "integer"
                                    },
                                    "modelo_id": {
                                        "type": "integer"
                                    },
                                    "canal": {
                                        "type": "string",
                                        "enum": [
                                            "email",
                                            "sms",
                                            "whatsapp"
                                        ]
                                    },
                                    "episodio_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "paciente_id",
                                    "modelo_id",
                                    "canal"
                                ]
                            },
                            "example": {
                                "paciente_id": 1204,
                                "modelo_id": 14,
                                "canal": "email",
                                "episodio_id": 77
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ok": {
                                                    "type": "boolean"
                                                },
                                                "mensagem": {
                                                    "type": "string"
                                                },
                                                "destino": {
                                                    "type": "string"
                                                },
                                                "canal_codigo": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "expira_em": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                },
                                                "documento_id": {
                                                    "type": "integer"
                                                },
                                                "entrega": {
                                                    "$ref": "#/components/schemas/M2Entrega"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ok": true,
                                        "mensagem": "Enviado para r***@example.com. O código seguiu numa mensagem separada.",
                                        "destino": "r***@example.com",
                                        "canal_codigo": "sms",
                                        "expira_em": "2026-10-30T10:00:00+00:00",
                                        "documento_id": 903,
                                        "entrega": {
                                            "id": 311,
                                            "modelo_id": 14,
                                            "modelo_versao": 2,
                                            "entregue_em": "2026-10-28T10:05:00+00:00",
                                            "liberta_em": "2026-10-29T10:05:00+00:00",
                                            "segundos_restantes": 86400,
                                            "estado": "entregue",
                                            "documento_id": 902,
                                            "canal": "app"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Ação recusada (acao_recusada)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M2RespostaErro"
                                },
                                "examples": {
                                    "envio_falhou": {
                                        "summary": "envio_falhou",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "acao_recusada",
                                                "mensagem": "Não foi possível enviar: sem email."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/recolha/registar": {
            "post": {
                "tags": [
                    "Consentimentos"
                ],
                "operationId": "m2RecolhaRegistar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.consentimentos:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.consentimentos",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Registar decisões e assinaturas",
                "description": "Cada modelo tem de trazer a decisão explícita («dado» ou «recusado»). Consentimentos escritos dados exigem a assinatura do paciente; o cirúrgico exige episódio, entrega registada, fim do período de reflexão e assinatura do médico (medico_id + assinatura_medico). contra_assinar acrescenta a assinatura do médico a consentimentos cirúrgicos assinados em casa. Erros de validação por campo: decisoes.N, modelo_{id}, assinatura_paciente, assinatura_medico, episodio_id, medico_id.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "paciente_id": {
                                        "type": "integer"
                                    },
                                    "episodio_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "quiosque": {
                                        "type": "boolean"
                                    },
                                    "medico_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "assinatura_paciente": {
                                        "type": "string",
                                        "contentEncoding": "base64",
                                        "maxLength": 2800000,
                                        "description": "Imagem PNG da assinatura, em base64 ou «data:image/png;base64,…» (máx. 2 MB)."
                                    },
                                    "assinatura_medico": {
                                        "type": "string",
                                        "contentEncoding": "base64",
                                        "maxLength": 2800000,
                                        "description": "Imagem PNG da assinatura, em base64 ou «data:image/png;base64,…» (máx. 2 MB)."
                                    },
                                    "decisoes": {
                                        "type": "array",
                                        "items": {
                                            "type": "object",
                                            "required": [
                                                "modelo_id",
                                                "decisao"
                                            ],
                                            "properties": {
                                                "modelo_id": {
                                                    "type": "integer"
                                                },
                                                "decisao": {
                                                    "type": "string",
                                                    "enum": [
                                                        "dado",
                                                        "recusado"
                                                    ]
                                                },
                                                "motivo": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        }
                                    },
                                    "contra_assinar": {
                                        "type": "array",
                                        "items": {
                                            "type": "integer"
                                        }
                                    }
                                },
                                "required": [
                                    "paciente_id"
                                ]
                            },
                            "example": {
                                "paciente_id": 1204,
                                "episodio_id": 77,
                                "medico_id": 7,
                                "assinatura_paciente": "data:image/png;base64,iVBORw0…",
                                "assinatura_medico": "data:image/png;base64,iVBORw0…",
                                "decisoes": [
                                    {
                                        "modelo_id": 14,
                                        "decisao": "dado"
                                    },
                                    {
                                        "modelo_id": 9,
                                        "decisao": "recusado",
                                        "motivo": "Prefere não receber comunicações"
                                    }
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "registados": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "integer"
                                                    }
                                                },
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "registados": [
                                            5501,
                                            5502
                                        ],
                                        "mensagem": "2 decisões registadas."
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/titulares/{id}/exportacao": {
            "get": {
                "tags": [
                    "Proteção de dados"
                ],
                "operationId": "m2TitularExportacao",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "summary": "Exportar os dados de um titular (ZIP)",
                "description": "Para pedidos de acesso e portabilidade: dados.json, resumo (PDF ou HTML), documentos partilháveis e imagens. Os registos clínicos só entram para quem tem acesso clínico ao paciente. Sem extensão ZIP no servidor, devolve dados.json.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do pedido do titular"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Arquivo",
                        "content": {
                            "application/zip": {
                                "schema": {
                                    "type": "string",
                                    "format": "binary"
                                }
                            },
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/conformidade/verificar/{codigo}": {
            "get": {
                "tags": [
                    "Documentos"
                ],
                "operationId": "m2Verificar",
                "security": [],
                "summary": "Verificação pública de um documento",
                "description": "Sem autenticação e sem dados clínicos: estado, número, tipo, datas, entidade, médico, iniciais do titular e impressões digitais do conteúdo e do PDF. Limite de pedidos por endereço.",
                "parameters": [
                    {
                        "name": "codigo",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^[A-Za-z0-9]{4}-?[A-Za-z0-9]{4}$"
                        },
                        "example": "K7QM-3XRA"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M2Verificacao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "valido": true,
                                        "estado": "assinado",
                                        "estado_rotulo": "Assinado",
                                        "numero": "DOC-2026-0142",
                                        "tipo": "instrucoes",
                                        "tipo_rotulo": "Instruções",
                                        "titulo": "Instruções pós-operatórias",
                                        "codigo_verificacao": "K7QM-3XRA",
                                        "emitido_em": "2026-10-28T09:58:00+00:00",
                                        "assinado_em": "2026-10-28T18:20:00+00:00",
                                        "assinatura_tipo": "codigo",
                                        "anulado_em": null,
                                        "conteudo_hash": "9f2c…e01a",
                                        "ficheiro_sha256": "41ab…77c0",
                                        "titular_iniciais": "R. A.",
                                        "medico": {
                                            "nome": "Inês Valente",
                                            "cedula": "54321"
                                        },
                                        "entidade": {
                                            "nome": "Clínica Capilar",
                                            "nome_legal": "Clínica Capilar, Lda.",
                                            "nif": "509999999",
                                            "ers_registo": "E123456",
                                            "licenca_numero": "12345/2025",
                                            "morada": "Avenida da Liberdade 100, 1250-001 Lisboa"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/consultas": {
            "post": {
                "tags": [
                    "Consultas"
                ],
                "operationId": "m1CriarConsulta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Nova consulta (rascunho)",
                "description": "Exige acesso clínico ao paciente. Episódio: o indicado (do mesmo paciente, senão 422), o ativo do paciente ou um novo. Com uma marcação já associada a uma consulta devolve essa consulta. A anamnese (antecedentes, medicação, alergias, hábitos, história familiar) vem pré-preenchida da última consulta assinada; o médico fica atribuído quando é um médico a criar, senão o médico do paciente. Devolve o pacote completo do ecrã. Efeitos: episódio na etapa 3 da jornada, linha do tempo, auditoria «criar»; quando abre um episódio, webhook episodio.aberto. Paciente fora do âmbito: 403 «sem_permissao» com erro.paciente_id (a app oferece o acesso de emergência). Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "paciente_id": {
                                        "type": "integer",
                                        "minimum": 1
                                    },
                                    "tipo": {
                                        "type": "string",
                                        "enum": [
                                            "primeira",
                                            "avaliacao",
                                            "controlo",
                                            "teleconsulta",
                                            "pre_operatoria"
                                        ],
                                        "default": "primeira"
                                    },
                                    "episodio_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "marcacao_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "data": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date-time",
                                        "description": "Por omissão, agora."
                                    }
                                },
                                "required": [
                                    "paciente_id"
                                ]
                            },
                            "example": {
                                "paciente_id": 1204,
                                "tipo": "primeira",
                                "episodio_id": 77,
                                "marcacao_id": 2051
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1PacoteConsulta"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/consultas/{id}": {
            "get": {
                "tags": [
                    "Consultas"
                ],
                "operationId": "m1ObterConsulta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "ver",
                "summary": "Consulta completa para o ecrã",
                "description": "Consulta decifrada, paciente (identificação mínima), episódio, alertas clínicos, elegibilidade ao vivo, intervalo de enxertos da tabela clínica aprovada (zona × grau), propostas da IA pendentes, consultas anteriores, último questionário prévio, permissões sobre a consulta, estado da IA para o paciente e a ligação de prescrição (só médicos). Exige ficha.clinica ≥ ver (ou acesso de emergência) e o paciente no âmbito clínico. Leitura auditada («ver», consultas). Paciente fora do âmbito: 403 «sem_permissao» com erro.paciente_id (a app oferece o acesso de emergência). Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da consulta"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1PacoteConsulta"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            },
            "put": {
                "tags": [
                    "Consultas"
                ],
                "operationId": "m1GravarConsulta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Gravar campos do rascunho",
                "description": "Gravação automática do ecrã: só os campos enviados mudam (lista fechada; outros são ignorados). Só rascunhos e com «editar» em ficha.clinica (consulta assinada → 403; corrige-se por aditamento). Médicos e enfermagem registam a anamnese; diagnóstico, diagnóstico diferencial, escala, grau, BASP, PRECISE, escalas, mapa, área, técnica e sessões são só do médico (enviados por outro perfil → 422 nesse campo). Textos clínicos até 20 000 caracteres, cifrados em repouso; escala e grau têm de ser coerentes. Recalcula e grava a elegibilidade com os valores finais. Efeitos: auditoria «alterar» com a lista de campos. Paciente fora do âmbito: 403 «sem_permissao» com erro.paciente_id (a app oferece o acesso de emergência). Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da consulta"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/M1ConsultaEntrada"
                            },
                            "example": {
                                "alergias": "Penicilina.",
                                "medicacao": "Apixabano 5 mg.",
                                "escala": "norwood",
                                "grau": "IV",
                                "zonas": {
                                    "zonas": [
                                        "linha_frontal",
                                        "frontal",
                                        "coroa"
                                    ],
                                    "pontos": [
                                        {
                                            "x": 0.5,
                                            "y": 0.71,
                                            "nota": "Miniaturização visível"
                                        }
                                    ],
                                    "linha": [
                                        {
                                            "x": 0.3,
                                            "y": 0.14
                                        },
                                        {
                                            "x": 0.5,
                                            "y": 0.11
                                        },
                                        {
                                            "x": 0.7,
                                            "y": 0.14
                                        }
                                    ]
                                },
                                "tecnica": "FUE",
                                "sessoes_previstas": 1
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "consulta": {
                                                    "$ref": "#/components/schemas/M1Consulta"
                                                },
                                                "elegibilidade": {
                                                    "$ref": "#/components/schemas/M1Elegibilidade"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "consulta": {
                                            "id": 4410,
                                            "paciente_id": 1204,
                                            "episodio_id": 77,
                                            "marcacao_id": 2051,
                                            "medico_id": 7,
                                            "medico_nome": "Inês Valente",
                                            "tipo": "primeira",
                                            "tipo_rotulo": "Primeira consulta",
                                            "data": "2026-10-28T10:00:00+00:00",
                                            "estado": "rascunho",
                                            "estado_rotulo": "Rascunho",
                                            "escala": "norwood",
                                            "grau": "IV",
                                            "basp": null,
                                            "precise_pontuacao": 62.5,
                                            "miniaturizacao_dadora_pct": 12,
                                            "area": "couro_cabeludo",
                                            "tecnica": "FUE",
                                            "sessoes_previstas": 1,
                                            "zonas": {
                                                "zonas": [
                                                    "linha_frontal",
                                                    "frontal",
                                                    "coroa"
                                                ],
                                                "pontos": [
                                                    {
                                                        "x": 0.5,
                                                        "y": 0.71,
                                                        "nota": "Miniaturização visível"
                                                    }
                                                ],
                                                "linha": [
                                                    {
                                                        "x": 0.3,
                                                        "y": 0.14
                                                    },
                                                    {
                                                        "x": 0.5,
                                                        "y": 0.11
                                                    },
                                                    {
                                                        "x": 0.7,
                                                        "y": 0.14
                                                    }
                                                ]
                                            },
                                            "escalas": {
                                                "norwood": "IV"
                                            },
                                            "elegibilidade": "apto_condicional",
                                            "elegibilidade_rotulo": "Apto com condições",
                                            "alertas": [
                                                {
                                                    "regra_id": 12,
                                                    "nome": "Anticoagulante",
                                                    "nivel": "alerta",
                                                    "mensagem": "Confirmar a suspensão com o médico assistente.",
                                                    "origem": "regra"
                                                }
                                            ],
                                            "viabilidade": null,
                                            "viabilidade_validada_por": null,
                                            "viabilidade_validada_em": null,
                                            "assinada_em": null,
                                            "assinada_por": null,
                                            "impressao_digital": null,
                                            "aditamentos": [],
                                            "criado_em": "2026-10-28T09:58:00+00:00",
                                            "atualizado_em": "2026-10-28T10:21:00+00:00",
                                            "motivo": "Queda progressiva na zona frontal desde há 5 anos.",
                                            "antecedentes": "Sem antecedentes relevantes.",
                                            "medicacao": "Apixabano 5 mg.",
                                            "alergias": "Penicilina.",
                                            "habitos": "Não fumador.",
                                            "historia_familiar": "Pai com alopecia androgenética.",
                                            "expectativas": "Recuperar a linha frontal.",
                                            "exame": "Rarefação frontal e na coroa; zona dadora com boa densidade.",
                                            "diagnostico": "Alopecia androgenética, Norwood IV.",
                                            "diagnostico_diferencial": null,
                                            "notas": null
                                        },
                                        "elegibilidade": {
                                            "estado": "apto_condicional",
                                            "alertas": [
                                                {
                                                    "regra_id": 12,
                                                    "nome": "Anticoagulante",
                                                    "nivel": "alerta",
                                                    "mensagem": "Confirmar a suspensão com o médico assistente.",
                                                    "origem": "regra"
                                                }
                                            ],
                                            "regras_aprovadas": 9,
                                            "motor": true
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/consultas/{id}/aditamentos": {
            "post": {
                "tags": [
                    "Consultas"
                ],
                "operationId": "m1AditarConsulta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da consulta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Correção por aditamento",
                "description": "Só em consultas assinadas (senão 403). Acrescenta, nunca reescreve: texto de 1 a 5000 caracteres, cifrado, com autor e data. Devolve todos os aditamentos por ordem cronológica. Efeitos: linha do tempo, auditoria «alterar». Paciente fora do âmbito: 403 «sem_permissao» com erro.paciente_id (a app oferece o acesso de emergência). Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "texto": {
                                        "type": "string",
                                        "minLength": 1,
                                        "maxLength": 5000
                                    }
                                },
                                "required": [
                                    "texto"
                                ]
                            },
                            "example": {
                                "texto": "Onde se lê «coroa», deve ler-se «zona média»."
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/M1Aditamento"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "texto": "Onde se lê «coroa», deve ler-se «zona média».",
                                            "autor_id": 7,
                                            "autor_nome": "Inês Valente",
                                            "em": "2026-10-29T09:12:00+00:00"
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/consultas/{id}/assinar": {
            "post": {
                "tags": [
                    "Consultas"
                ],
                "operationId": "m1AssinarConsulta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da consulta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Assinar a consulta (médicos)",
                "description": "Exige confirmar = true, consulta em rascunho, médico com «editar» em ficha.clinica e a consulta sem médico, do próprio médico ou com âmbito «todos» (senão 403). Recusa (422) sem exame nem diagnóstico. Grava a impressão digital SHA-256 da serialização canónica do conteúdo (campos, data de assinatura e médico) e, se enviada, a assinatura desenhada (PNG em data URL, até 2 MB) como ficheiro clínico privado. Depois de assinada nada se reescreve: só aditamentos. Efeitos: linha do tempo, auditoria «assinar», webhook consulta.assinada. Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "confirmar": {
                                        "const": true
                                    },
                                    "assinatura": {
                                        "type": "string",
                                        "pattern": "^data:image/png;base64,",
                                        "maxLength": 2800000,
                                        "description": "Assinatura desenhada (opcional)."
                                    }
                                },
                                "required": [
                                    "confirmar"
                                ]
                            },
                            "example": {
                                "confirmar": true,
                                "assinatura": "data:image/png;base64,iVBORw0KGgo…"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1Consulta"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 4410,
                                        "paciente_id": 1204,
                                        "episodio_id": 77,
                                        "marcacao_id": 2051,
                                        "medico_id": 7,
                                        "medico_nome": "Inês Valente",
                                        "tipo": "primeira",
                                        "tipo_rotulo": "Primeira consulta",
                                        "data": "2026-10-28T10:00:00+00:00",
                                        "estado": "assinada",
                                        "estado_rotulo": "Assinada",
                                        "escala": "norwood",
                                        "grau": "IV",
                                        "basp": null,
                                        "precise_pontuacao": 62.5,
                                        "miniaturizacao_dadora_pct": 12,
                                        "area": "couro_cabeludo",
                                        "tecnica": "FUE",
                                        "sessoes_previstas": 1,
                                        "zonas": {
                                            "zonas": [
                                                "linha_frontal",
                                                "frontal",
                                                "coroa"
                                            ],
                                            "pontos": [
                                                {
                                                    "x": 0.5,
                                                    "y": 0.71,
                                                    "nota": "Miniaturização visível"
                                                }
                                            ],
                                            "linha": [
                                                {
                                                    "x": 0.3,
                                                    "y": 0.14
                                                },
                                                {
                                                    "x": 0.5,
                                                    "y": 0.11
                                                },
                                                {
                                                    "x": 0.7,
                                                    "y": 0.14
                                                }
                                            ]
                                        },
                                        "escalas": {
                                            "norwood": "IV"
                                        },
                                        "elegibilidade": "apto_condicional",
                                        "elegibilidade_rotulo": "Apto com condições",
                                        "alertas": [
                                            {
                                                "regra_id": 12,
                                                "nome": "Anticoagulante",
                                                "nivel": "alerta",
                                                "mensagem": "Confirmar a suspensão com o médico assistente.",
                                                "origem": "regra"
                                            }
                                        ],
                                        "viabilidade": null,
                                        "viabilidade_validada_por": null,
                                        "viabilidade_validada_em": null,
                                        "assinada_em": "2026-10-28T10:45:00+00:00",
                                        "assinada_por": "Inês Valente",
                                        "impressao_digital": "9f2c1e7a54b3d8f60a1c2e3d4b5a69788c7d6e5f4a3b2c1d0e9f8a7b6c5d4e3f",
                                        "aditamentos": [],
                                        "criado_em": "2026-10-28T09:58:00+00:00",
                                        "atualizado_em": "2026-10-28T10:21:00+00:00",
                                        "motivo": "Queda progressiva na zona frontal desde há 5 anos.",
                                        "antecedentes": "Sem antecedentes relevantes.",
                                        "medicacao": "Apixabano 5 mg.",
                                        "alergias": "Penicilina.",
                                        "habitos": "Não fumador.",
                                        "historia_familiar": "Pai com alopecia androgenética.",
                                        "expectativas": "Recuperar a linha frontal.",
                                        "exame": "Rarefação frontal e na coroa; zona dadora com boa densidade.",
                                        "diagnostico": "Alopecia androgenética, Norwood IV.",
                                        "diagnostico_diferencial": null,
                                        "notas": null
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/consultas/{id}/completude": {
            "get": {
                "tags": [
                    "Consultas"
                ],
                "operationId": "m1CompletudeConsulta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "ver",
                "summary": "Verificação de completude antes da cirurgia",
                "description": "O que já está e o que falta no episódio: consulta assinada, notas clínicas, viabilidade validada, questionário prévio validado, alertas validados, fotografias, plano aprovado, consentimento cirúrgico, proposta aceite e sinal pago. Cada item: ok, falta ou indisponivel (módulo ausente), com a ligação web e app para resolver. Só estados — nunca valores comerciais nem conteúdo de outros módulos. Paciente fora do âmbito: 403 «sem_permissao» com erro.paciente_id (a app oferece o acesso de emergência). Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da consulta"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1Completude"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "itens": [
                                            {
                                                "chave": "consulta_assinada",
                                                "rotulo": "Consulta assinada",
                                                "estado": "ok",
                                                "estado_rotulo": "Feito",
                                                "detalhe": null,
                                                "ligacao": {
                                                    "web": "equipa/consulta?id=4410",
                                                    "app": "/e/consulta?id=4410"
                                                }
                                            },
                                            {
                                                "chave": "fotografias",
                                                "rotulo": "Fotografias",
                                                "estado": "ok",
                                                "estado_rotulo": "Feito",
                                                "detalhe": "6 fotografias",
                                                "ligacao": {
                                                    "web": "equipa/ficha?id=1204#fotografias",
                                                    "app": "/e/ficha_paciente?id=1204&seccao=fotografias"
                                                }
                                            },
                                            {
                                                "chave": "consentimento",
                                                "rotulo": "Consentimento cirúrgico",
                                                "estado": "falta",
                                                "estado_rotulo": "Em falta",
                                                "detalhe": null,
                                                "ligacao": {
                                                    "web": "equipa/ficha?id=1204#consentimentos",
                                                    "app": "/e/ficha_paciente?id=1204&seccao=consentimentos"
                                                }
                                            }
                                        ],
                                        "pronto": false,
                                        "em_falta": 1
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/consultas/{id}/elegibilidade": {
            "post": {
                "tags": [
                    "Consultas"
                ],
                "operationId": "m1ElegibilidadeConsulta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da consulta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "ver",
                "summary": "Avaliar a elegibilidade com valores por gravar",
                "description": "Junta à consulta gravada os valores enviados (só os que entram nas regras, até 20 000 caracteres cada) e avalia as regras de elegibilidade aprovadas da clínica e os limites da versão aprovada do motor (idade mínima, idade de alerta, miniaturização máxima). Nada é gravado. Estado: por_avaliar (sem regras nem motor), nao_apto (algum bloqueio), apto_condicional (algum alerta) ou apto. Paciente fora do âmbito: 403 «sem_permissao» com erro.paciente_id (a app oferece o acesso de emergência). Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "alergias": {
                                        "type": "string"
                                    },
                                    "medicacao": {
                                        "type": "string"
                                    },
                                    "antecedentes": {
                                        "type": "string"
                                    },
                                    "habitos": {
                                        "type": "string"
                                    },
                                    "miniaturizacao_dadora_pct": {
                                        "type": [
                                            "number",
                                            "null"
                                        ],
                                        "minimum": 0,
                                        "maximum": 100,
                                        "x-unidade": "%"
                                    },
                                    "precise_pontuacao": {
                                        "type": [
                                            "number",
                                            "null"
                                        ],
                                        "minimum": 0,
                                        "maximum": 100,
                                        "x-unidade": "%"
                                    },
                                    "escala": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "enum": [
                                            "norwood",
                                            "ludwig",
                                            "savin",
                                            "sinclair",
                                            "basp",
                                            "outra",
                                            null
                                        ]
                                    },
                                    "grau": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "area": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "enum": [
                                            "couro_cabeludo",
                                            "barba",
                                            "sobrancelhas",
                                            "feminina",
                                            "reparacao",
                                            "outra",
                                            null
                                        ]
                                    },
                                    "tecnica": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "enum": [
                                            "FUE",
                                            "FUT",
                                            "DHI",
                                            "outra",
                                            null
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "medicacao": "Apixabano 5 mg",
                                "miniaturizacao_dadora_pct": 12,
                                "escala": "norwood",
                                "grau": "IV"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1Elegibilidade"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "estado": "apto_condicional",
                                        "alertas": [
                                            {
                                                "regra_id": 12,
                                                "nome": "Anticoagulante",
                                                "nivel": "alerta",
                                                "mensagem": "Confirmar a suspensão com o médico assistente.",
                                                "origem": "regra"
                                            }
                                        ],
                                        "regras_aprovadas": 9,
                                        "motor": true
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/consultas/{id}/escriba": {
            "post": {
                "tags": [
                    "Consultas"
                ],
                "operationId": "m1EscribaConsulta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da consulta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Escriba: propostas a partir da transcrição",
                "description": "Só consultas em rascunho. O texto da consulta (colado ou ditado, 20 a 40 000 caracteres) ou um ficheiro de transcrição (.txt, .vtt ou .srt, texto, até 1 MB; numeração e tempos das legendas retirados) é lido e descartado — nunca é guardado. O assistente propõe cada campo (motivo, anamnese, exame, diagnóstico, escala, grau, miniaturização, notas) com o excerto exato de onde vem e a confiança; o servidor confirma se o excerto existe mesmo na transcrição (fatores.excerto_verificado). Propostas e excertos ficam cifrados. Usa o assistente de IA da clínica: exige o consentimento «ia» válido do paciente e o uso configurado (senão 422). O resultado nunca é uma decisão — cada valor fica como proposta pendente (ia_propostas) com o modelo usado, os parâmetros do pedido e os fatores explicativos registados, até um médico a aceitar, corrigir ou recusar. Só médicos (família de perfil «medico») com «editar» em ficha.clinica e o paciente no âmbito clínico; os outros perfis recebem 403. Efeitos: propostas pendentes, auditoria «criar» em ia_propostas. Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After). Limite adicional: 30 pedidos por 10 minutos por endereço IP (contam só os pedidos que alteram dados).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "texto"
                                ],
                                "properties": {
                                    "texto": {
                                        "type": "string",
                                        "minLength": 20,
                                        "maxLength": 40000
                                    }
                                }
                            },
                            "example": {
                                "texto": "Médica: o que o traz cá? Paciente: estou a perder cabelo à frente há uns cinco anos… sou alérgico à penicilina, fiquei cheio de manchas."
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary",
                                        "description": "Transcrição .txt, .vtt ou .srt (até 1 MB); usado só sem «texto»."
                                    },
                                    "texto": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "lote": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "propostas": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/M1PropostaIa"
                                                    }
                                                },
                                                "fornecedor": {
                                                    "type": "string",
                                                    "description": "Serviço que respondeu (o local da clínica ou o externo de recurso)."
                                                },
                                                "modelo": {
                                                    "type": "string",
                                                    "description": "Modelo usado (também registado em cada proposta)."
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "lote": "3f2a9c0d6b1e4a7f8c2d5e9b0a1f3c4d",
                                        "propostas": [
                                            {
                                                "id": 9120,
                                                "paciente_id": 1204,
                                                "episodio_id": 77,
                                                "consulta_id": 4410,
                                                "resposta_id": null,
                                                "tipo": "escriba",
                                                "tipo_rotulo": "Escriba",
                                                "campo": "alergias",
                                                "campo_rotulo": "Alergias",
                                                "valor_proposto": "Alergia a penicilina (exantema).",
                                                "excerto_origem": "sou alérgico à penicilina, fiquei cheio de manchas",
                                                "fatores": {
                                                    "excerto_verificado": true,
                                                    "confianca_modelo": 0.92
                                                },
                                                "confianca": 0.92,
                                                "estado": "pendente",
                                                "estado_rotulo": "Pendente",
                                                "valor_final": null,
                                                "decidido_por": null,
                                                "decidido_em": null,
                                                "motivo": null,
                                                "lote": "3f2a9c0d6b1e4a7f8c2d5e9b0a1f3c4d",
                                                "criado_em": "2026-10-28T10:22:00+00:00"
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/consultas/{id}/escriba/audio": {
            "post": {
                "tags": [
                    "Consultas"
                ],
                "operationId": "m1EscribaAudio",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da consulta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Escriba por ditado: transcrever uma parte do áudio da consulta",
                "description": "Só consultas em rascunho e só médicos. Uma parte do áudio (WAV 16 kHz mono de ~45 s enviado pela web e pela app; também MP3, OGG, FLAC, WEBM ou M4A, até 4 MB e 2 minutos). Em cada parte confirmam-se os consentimentos do paciente «gravacao_video» (gravação das consultas) e «ia» — sem eles, 422 com o código «consentimento_em_falta». O áudio é transcrito (uso «escriba», tipo transcrição: serviço local primeiro; externo só com o interruptor dos dados de pacientes) e descartado: nunca é guardado. A transcrição volta na resposta e não é guardada. Usa o assistente de IA da clínica: exige o consentimento «ia» válido do paciente e o uso configurado (senão 422). O resultado nunca é uma decisão — cada valor fica como proposta pendente (ia_propostas) com o modelo usado, os parâmetros do pedido e os fatores explicativos registados, até um médico a aceitar, corrigir ou recusar. Só médicos (família de perfil «medico») com «editar» em ficha.clinica e o paciente no âmbito clínico; os outros perfis recebem 403. Efeitos: auditoria «criar» em consultas só com as métricas (parte, segundos, bytes, serviço, caracteres). Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After). Limite adicional: 240 pedidos por 10 minutos por endereço IP (contam só os pedidos que alteram dados).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ficheiro"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary"
                                    },
                                    "parte": {
                                        "type": "integer"
                                    },
                                    "lingua": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "texto": {
                                                    "type": "string"
                                                },
                                                "segundos": {
                                                    "type": "integer"
                                                },
                                                "servico": {
                                                    "type": "string",
                                                    "enum": [
                                                        "local",
                                                        "externo"
                                                    ]
                                                },
                                                "parte": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "texto": "Paciente: estou a perder cabelo à frente há uns cinco anos.",
                                        "segundos": 45,
                                        "servico": "local",
                                        "parte": 1
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/consultas/{id}/escriba/transcricao": {
            "get": {
                "tags": [
                    "Consultas"
                ],
                "operationId": "m1EscribaTranscricaoLer",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da consulta"
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Ler a transcrição gravada pelo médico",
                "description": "Texto decifrado (leitura auditada) e metadados; texto null quando não há. Só médicos (família de perfil «medico») com «editar» em ficha.clinica e o paciente no âmbito clínico; os outros perfis recebem 403.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "texto": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "gravada": {
                                                    "type": "boolean"
                                                },
                                                "em": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                },
                                                "por": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "segundos": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            },
            "post": {
                "tags": [
                    "Consultas"
                ],
                "operationId": "m1EscribaTranscricaoGravar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da consulta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Gravar a transcrição na consulta (cifrada)",
                "description": "Só consultas em rascunho. 20 a 40 000 caracteres, guardados cifrados com a chave clínica (substitui a anterior). Só médicos (família de perfil «medico») com «editar» em ficha.clinica e o paciente no âmbito clínico; os outros perfis recebem 403.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "texto": {
                                        "type": "string",
                                        "minLength": 20,
                                        "maxLength": 40000
                                    },
                                    "segundos": {
                                        "type": "integer"
                                    }
                                },
                                "required": [
                                    "texto"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "gravada": {
                                                    "type": "boolean"
                                                },
                                                "em": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                },
                                                "por": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "segundos": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/consultas/{id}/escriba/transcricao/apagar": {
            "post": {
                "tags": [
                    "Consultas"
                ],
                "operationId": "m1EscribaTranscricaoApagar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da consulta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Descartar a transcrição gravada",
                "description": "Apaga o texto cifrado e os metadados; a auditoria regista o ato (sem o texto). Só médicos (família de perfil «medico») com «editar» em ficha.clinica e o paciente no âmbito clínico; os outros perfis recebem 403.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "gravada": {
                                                    "type": "boolean"
                                                },
                                                "em": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                },
                                                "por": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "segundos": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/consultas/{id}/pre-analise": {
            "post": {
                "tags": [
                    "Consultas"
                ],
                "operationId": "m1PreAnaliseConsulta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da consulta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Pré-análise das fotografias",
                "description": "Até 6 fotografias: as indicadas em ficheiro_ids (só imagens do paciente, ou sem dono, da clínica atual), ou as mais recentes da galeria do paciente (sem simulações nem rejeitadas), ou as da última pré-avaliação; sem fotografias → 422. O assistente propõe escala e grau, um intervalo de enxertos (entra como proposta de notas) e o estado da zona dadora (proposta de exame), seguindo a tabela clínica aprovada do motor quando existe; justificação, observações e fotografias usadas ficam nos fatores. Usa o assistente de IA da clínica: exige o consentimento «ia» válido do paciente e o uso configurado (senão 422). O resultado nunca é uma decisão — cada valor fica como proposta pendente (ia_propostas) com o modelo usado, os parâmetros do pedido e os fatores explicativos registados, até um médico a aceitar, corrigir ou recusar. Só médicos (família de perfil «medico») com «editar» em ficha.clinica e o paciente no âmbito clínico; os outros perfis recebem 403. Efeitos: propostas pendentes, auditoria «criar» em ia_propostas. Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After). Limite adicional: 20 pedidos por 10 minutos por endereço IP (contam só os pedidos que alteram dados).",
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "ficheiro_ids": {
                                        "type": "array",
                                        "items": {
                                            "type": "integer",
                                            "minimum": 1
                                        },
                                        "description": "Usam-se os primeiros 6 (repetidos retirados); vazio = fotografias mais recentes."
                                    }
                                }
                            },
                            "example": {
                                "ficheiro_ids": [
                                    8812,
                                    8813,
                                    8814
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "lote": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "propostas": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/M1PropostaIa"
                                                    }
                                                },
                                                "fotos": {
                                                    "type": "integer",
                                                    "minimum": 1,
                                                    "maximum": 6
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/consultas/{id}/viabilidade": {
            "post": {
                "tags": [
                    "Consultas"
                ],
                "operationId": "m1ViabilidadeConsulta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da consulta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Validar a viabilidade (médicos)",
                "description": "Regista a decisão, quem decidiu e quando. A nota entra nas notas (rascunho) ou como aditamento (assinada). Com o episódio em «avaliacao»: «viavel» passa-o a «plano» (etapa 4) e «nao_viavel» fecha-o como «cancelado»; «condicional» mantém-no. Devolve a consulta e o episódio na forma M1Episodio (sem conteúdo clínico, com a equipa ativa), ou null sem episódio. Efeitos: linha do tempo, auditoria «aprovar»; com mudança de estado, tarefas automáticas do estado e webhook episodio.estado_alterado. Só médicos (família de perfil «medico») com «editar» em ficha.clinica e o paciente no âmbito clínico; os outros perfis recebem 403. Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "decisao": {
                                        "type": "string",
                                        "enum": [
                                            "viavel",
                                            "condicional",
                                            "nao_viavel"
                                        ]
                                    },
                                    "nota": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "decisao"
                                ]
                            },
                            "example": {
                                "decisao": "viavel",
                                "nota": "Dadora suficiente para uma sessão."
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "consulta": {
                                                    "$ref": "#/components/schemas/M1Consulta"
                                                },
                                                "episodio": {
                                                    "oneOf": [
                                                        {
                                                            "$ref": "#/components/schemas/M1Episodio"
                                                        },
                                                        {
                                                            "type": "null"
                                                        }
                                                    ],
                                                    "description": "Episódio depois da decisão (o mesmo formato da ficha)."
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/crm/agente": {
            "get": {
                "tags": [
                    "Agente de IA"
                ],
                "operationId": "crmPedidosAgente",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "ver",
                "summary": "Pedidos do agente",
                "description": "Pedidos atendidos pelo agente de voz e pelos assistentes escritos. Por omissão só os abertos; todos=1 inclui os resolvidos. meta traz as contagens por estado, o consumo do mês e se o assistente está configurado.",
                "parameters": [
                    {
                        "name": "estado",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "ia_a_tratar",
                                "passado_equipa",
                                "resolvido",
                                "validado"
                            ]
                        },
                        "description": "Estado"
                    },
                    {
                        "name": "tipo",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "marcacao",
                                "informacao",
                                "pos_operatorio",
                                "pagamento",
                                "alarme",
                                "outro"
                            ]
                        },
                        "description": "Tipo"
                    },
                    {
                        "name": "canal",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "voz",
                                "whatsapp",
                                "chat"
                            ]
                        },
                        "description": "Canal"
                    },
                    {
                        "name": "alarme",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "1"
                            ]
                        },
                        "description": "Só sinais de alarme"
                    },
                    {
                        "name": "amostra",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "1"
                            ]
                        },
                        "description": "Só amostras para revisão"
                    },
                    {
                        "name": "todos",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "1"
                            ]
                        },
                        "description": "Incluir resolvidos"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/CrmPedidoAgente"
                                            }
                                        },
                                        "meta": {
                                            "allOf": [
                                                {
                                                    "$ref": "#/components/schemas/Meta"
                                                },
                                                {
                                                    "type": "object",
                                                    "properties": {
                                                        "contagens": {
                                                            "type": "object"
                                                        },
                                                        "consumo": {
                                                            "$ref": "#/components/schemas/CrmConsumoAgente"
                                                        },
                                                        "configurado": {
                                                            "type": "boolean"
                                                        },
                                                        "motor": {
                                                            "type": "string",
                                                            "enum": [
                                                                "externo",
                                                                "proprio"
                                                            ],
                                                            "description": "Motor de voz da clínica (Definições › crm.agente.motor)."
                                                        },
                                                        "voz_configurada": {
                                                            "type": "boolean",
                                                            "description": "O motor próprio tem com que responder (senão, as chamadas passam a uma pessoa)."
                                                        }
                                                    }
                                                }
                                            ]
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 77,
                                            "canal": "voz",
                                            "canal_rotulo": "Voz",
                                            "tipo": "marcacao",
                                            "tipo_rotulo": "Marcação",
                                            "estado": "passado_equipa",
                                            "estado_rotulo": "Com a equipa",
                                            "pessoa": {
                                                "tipo": "paciente",
                                                "id": 702,
                                                "nome": "Helena Duarte"
                                            },
                                            "nome": "Helena Duarte",
                                            "telefone": "+351936000111",
                                            "intencao": "Remarcar consulta de revisão",
                                            "proximo_passo": "Receção propõe nova data",
                                            "sinal_alarme": false,
                                            "resumo": "Pede para mudar a consulta de quinta para a semana seguinte.",
                                            "resumo_reservado": false,
                                            "idioma": "pt-PT",
                                            "duracao_s": 143,
                                            "aviso_ia": true,
                                            "identificacao_verificada": true,
                                            "amostra": false,
                                            "revisao_estado": null,
                                            "conversa_id": null,
                                            "marcacao_id": null,
                                            "assumido_por": null,
                                            "criado_em": "2026-10-27T21:14:00+00:00"
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/crm/agente/saida": {
            "get": {
                "tags": [
                    "Agente de IA"
                ],
                "operationId": "crmAgenteSaida",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "ver",
                "summary": "Chamadas de saída do agente",
                "description": "Listas do marcador chamadas pelo agente de voz: progresso, chamadas em curso, janela e se pode ligar agora (com o motivo quando não pode).",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "instalado": {
                                                    "type": "boolean"
                                                },
                                                "ativo": {
                                                    "type": "boolean"
                                                },
                                                "empurra": {
                                                    "type": "boolean"
                                                },
                                                "listas": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "integer"
                                                            },
                                                            "nome": {
                                                                "type": "string"
                                                            },
                                                            "tipo": {
                                                                "type": "string"
                                                            },
                                                            "tipo_rotulo": {
                                                                "type": "string"
                                                            },
                                                            "estado": {
                                                                "type": "string"
                                                            },
                                                            "estado_rotulo": {
                                                                "type": "string"
                                                            },
                                                            "total": {
                                                                "type": "integer"
                                                            },
                                                            "concluidos": {
                                                                "type": "integer"
                                                            },
                                                            "bloqueados": {
                                                                "type": "integer"
                                                            },
                                                            "em_curso": {
                                                                "type": "integer"
                                                            },
                                                            "pode_ligar_agora": {
                                                                "type": "boolean"
                                                            },
                                                            "motivo": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "motivo_rotulo": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "janela": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/crm/agente/testes": {
            "get": {
                "tags": [
                    "Agente de IA"
                ],
                "operationId": "crmAgenteTestes",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "ver",
                "summary": "Testes do agente",
                "description": "Conversas de teste, rascunhos da base de conhecimento por publicar, regras em vigor, últimas execuções e se os testes são obrigatórios.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "testes": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "rascunhos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "execucoes": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/CrmExecucaoTestes"
                                                    }
                                                },
                                                "regras": {
                                                    "type": "object",
                                                    "properties": {
                                                        "temas_proibidos": {
                                                            "type": "array",
                                                            "items": {
                                                                "type": "string"
                                                            }
                                                        },
                                                        "alarmes": {
                                                            "type": "array",
                                                            "items": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                },
                                                "obrigatorios": {
                                                    "type": "boolean"
                                                },
                                                "pode_editar": {
                                                    "type": "boolean"
                                                },
                                                "pode_aprovar_clinico": {
                                                    "type": "boolean"
                                                },
                                                "canais": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "linguas": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            },
            "post": {
                "tags": [
                    "Agente de IA"
                ],
                "operationId": "crmAgenteTesteCriar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "editar",
                "summary": "Criar uma conversa de teste",
                "description": "«falas»: uma por linha, «Agente:» nas do agente; a última é da pessoa. O texto é limpo de dados pessoais antes de ser guardado.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "titulo": {
                                        "type": "string"
                                    },
                                    "canal": {
                                        "type": "string",
                                        "enum": [
                                            "voz",
                                            "escrito"
                                        ]
                                    },
                                    "lingua": {
                                        "type": "string",
                                        "enum": [
                                            "pt-PT",
                                            "pt-BR",
                                            "en",
                                            "es",
                                            "fr",
                                            "de"
                                        ]
                                    },
                                    "falas": {
                                        "type": "string"
                                    },
                                    "deve_conter": {
                                        "type": "string"
                                    },
                                    "nao_deve_conter": {
                                        "type": "string"
                                    },
                                    "passar_equipa": {
                                        "type": "string",
                                        "enum": [
                                            "sim",
                                            "nao",
                                            "indiferente"
                                        ]
                                    },
                                    "sinal_alarme": {
                                        "type": "string",
                                        "enum": [
                                            "sim",
                                            "nao",
                                            "indiferente"
                                        ]
                                    },
                                    "ativo": {
                                        "type": "boolean"
                                    }
                                },
                                "required": [
                                    "titulo",
                                    "falas"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/crm/agente/testes/execucoes": {
            "post": {
                "tags": [
                    "Agente de IA"
                ],
                "operationId": "crmAgenteExecucaoCriar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "editar",
                "summary": "Correr os testes contra a versão nova",
                "description": "Rascunhos escolhidos e/ou regras propostas (só contam as diferentes das que estão em vigor). Corre em segundo plano (agendador crm.agente_testes): cada conversa ativa é respondida pela versão atual e pela nova. 422 sem alvo ou sem conversas de teste.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "artigos": {
                                        "type": "array",
                                        "items": {
                                            "type": "integer"
                                        }
                                    },
                                    "temas_proibidos": {
                                        "type": "string"
                                    },
                                    "alarmes": {
                                        "type": "string"
                                    },
                                    "titulo": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmExecucaoTestes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/crm/agente/testes/execucoes/{id}": {
            "get": {
                "tags": [
                    "Agente de IA"
                ],
                "operationId": "crmAgenteExecucao",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "ver",
                "summary": "Uma execução com a comparação",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmExecucaoTestes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/crm/agente/testes/execucoes/{id}/decisao": {
            "post": {
                "tags": [
                    "Agente de IA"
                ],
                "operationId": "crmAgenteExecucaoDecidir",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "editar",
                "summary": "Aprovar e publicar, ou rejeitar",
                "description": "«aprovada»: os rascunhos testados passam a aprovados (conteúdo clínico só pela direção clínica; um rascunho alterado depois da execução dá 409) e as regras propostas passam às Definições. Auditado.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "decisao": {
                                        "type": "string",
                                        "enum": [
                                            "aprovada",
                                            "rejeitada"
                                        ]
                                    },
                                    "nota": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "decisao"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmExecucaoTestes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/crm/agente/testes/{id}": {
            "put": {
                "tags": [
                    "Agente de IA"
                ],
                "operationId": "crmAgenteTesteGravar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "editar",
                "summary": "Alterar uma conversa de teste",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "titulo": {
                                        "type": "string"
                                    },
                                    "canal": {
                                        "type": "string"
                                    },
                                    "lingua": {
                                        "type": "string"
                                    },
                                    "falas": {
                                        "type": "string"
                                    },
                                    "deve_conter": {
                                        "type": "string"
                                    },
                                    "nao_deve_conter": {
                                        "type": "string"
                                    },
                                    "passar_equipa": {
                                        "type": "string"
                                    },
                                    "sinal_alarme": {
                                        "type": "string"
                                    },
                                    "ativo": {
                                        "type": "boolean"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/crm/agente/{id}": {
            "get": {
                "tags": [
                    "Agente de IA"
                ],
                "operationId": "crmPedidoAgente",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "ver",
                "summary": "Detalhe do pedido",
                "description": "Transcrição, notas referidas pelo paciente, sinais detetados e gravação só para quem vê a ficha clínica. Leitura auditada.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmPedidoAgente"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 77,
                                        "canal": "voz",
                                        "canal_rotulo": "Voz",
                                        "tipo": "marcacao",
                                        "tipo_rotulo": "Marcação",
                                        "estado": "passado_equipa",
                                        "estado_rotulo": "Com a equipa",
                                        "pessoa": {
                                            "tipo": "paciente",
                                            "id": 702,
                                            "nome": "Helena Duarte"
                                        },
                                        "nome": "Helena Duarte",
                                        "telefone": "+351936000111",
                                        "intencao": "Remarcar consulta de revisão",
                                        "proximo_passo": "Receção propõe nova data",
                                        "sinal_alarme": false,
                                        "resumo": "Pede para mudar a consulta de quinta para a semana seguinte.",
                                        "resumo_reservado": false,
                                        "idioma": "pt-PT",
                                        "duracao_s": 143,
                                        "aviso_ia": true,
                                        "identificacao_verificada": true,
                                        "amostra": false,
                                        "revisao_estado": null,
                                        "conversa_id": null,
                                        "marcacao_id": null,
                                        "assumido_por": null,
                                        "criado_em": "2026-10-27T21:14:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/crm/agente/{id}/assumir": {
            "post": {
                "tags": [
                    "Agente de IA"
                ],
                "operationId": "crmAssumirPedido",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "ver",
                "summary": "Assumir o pedido",
                "description": "Passa o pedido à equipa (estado «passado_equipa»), regista quem assumiu e, se houver conversa escrita, tira-a ao assistente.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmPedidoAgente"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/crm/agente/{id}/correcao": {
            "post": {
                "tags": [
                    "Agente de IA"
                ],
                "operationId": "crmCorrigirAgente",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "ver",
                "summary": "Corrigir uma resposta do agente",
                "description": "Cria um rascunho na base de conhecimento (categoria «correção») ligado a este pedido. Só entra em uso depois de aprovado; conteúdo clínico só pela direção clínica. Efeitos: notificação a quem aprova.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "titulo": {
                                        "type": "string",
                                        "maxLength": 190
                                    },
                                    "texto": {
                                        "type": "string",
                                        "maxLength": 8000
                                    },
                                    "clinico": {
                                        "type": "boolean"
                                    }
                                },
                                "required": [
                                    "titulo",
                                    "texto"
                                ]
                            },
                            "example": {
                                "titulo": "Estacionamento",
                                "texto": "A clínica tem estacionamento gratuito para pacientes no piso -1.",
                                "clinico": false
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "base_conhecimento_id": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "base_conhecimento_id": 48
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/crm/agente/{id}/resolver": {
            "post": {
                "tags": [
                    "Agente de IA"
                ],
                "operationId": "crmResolverPedido",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "ver",
                "summary": "Resolver o pedido",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmPedidoAgente"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/crm/agente/{id}/revisao": {
            "post": {
                "tags": [
                    "Agente de IA"
                ],
                "operationId": "crmReverPedido",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "editar",
                "summary": "Rever uma amostra",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "estado": {
                                        "type": "string",
                                        "enum": [
                                            "conforme",
                                            "a_corrigir"
                                        ]
                                    },
                                    "nota": {
                                        "type": "string",
                                        "maxLength": 1000
                                    }
                                },
                                "required": [
                                    "estado"
                                ]
                            },
                            "example": {
                                "estado": "a_corrigir",
                                "nota": "Não ofereceu falar com uma pessoa."
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmPedidoAgente"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/crm/agente/{id}/teste": {
            "post": {
                "tags": [
                    "Agente de IA"
                ],
                "operationId": "crmAgenteTesteDoPedido",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "editar",
                "summary": "Criar uma conversa de teste a partir de um pedido",
                "description": "Usa a versão sem dados pessoais da conversa (turnos do motor de voz ou transcrição).",
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "teste_id": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/crm/agente/{id}/validar": {
            "post": {
                "tags": [
                    "Agente de IA"
                ],
                "operationId": "crmValidarNotas",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "ver",
                "summary": "Validar as notas referidas pelo paciente",
                "description": "Só a equipa clínica (403 para os outros). Pode corrigir o texto. O pedido passa a «validado».",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "notas": {
                                        "type": "string",
                                        "maxLength": 8000
                                    }
                                }
                            },
                            "example": {
                                "notas": "Refere ligeiro ardor na zona recetora ao terceiro dia, sem febre."
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmPedidoAgente"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/crm/chamadas/estatisticas": {
            "get": {
                "tags": [
                    "Marcador e chamadas"
                ],
                "operationId": "crmEstatisticasChamadas",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "ver",
                "summary": "Estatísticas de chamadas",
                "description": "Por pessoa (atendidas, perdidas, fora de horas, feitas, tempo médio de devolução), chamadas por devolver dos últimos 7 dias e mapa de calor das chamadas recebidas por dia da semana e hora.",
                "parameters": [
                    {
                        "name": "de",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Início"
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Fim"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmEstatisticasChamadas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/crm/conversas": {
            "get": {
                "tags": [
                    "Caixa de entrada"
                ],
                "operationId": "crmListarConversas",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "ver",
                "summary": "Caixa de entrada",
                "description": "Conversas de todos os canais, mais recentes primeiro. meta.contagens traz o número por fila (minhas, por_atribuir, ia, atrasadas, todas).",
                "parameters": [
                    {
                        "name": "fila",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "minhas",
                                "por_atribuir",
                                "ia",
                                "atrasadas",
                                "todas",
                                "resolvidas"
                            ],
                            "default": "todas"
                        },
                        "description": "Fila"
                    },
                    {
                        "name": "canal",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "portal",
                                "whatsapp",
                                "instagram",
                                "messenger",
                                "email",
                                "chat_site",
                                "sms"
                            ]
                        },
                        "description": "Canal"
                    },
                    {
                        "name": "estado",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "aberta",
                                "pendente",
                                "resolvida"
                            ]
                        },
                        "description": "Estado"
                    },
                    {
                        "name": "departamento",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "administracao",
                                "medico",
                                "enfermagem",
                                "tecnico",
                                "comercial",
                                "rececao"
                            ]
                        },
                        "description": "Departamento"
                    },
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/CrmConversaLinha"
                                            }
                                        },
                                        "meta": {
                                            "allOf": [
                                                {
                                                    "$ref": "#/components/schemas/Meta"
                                                },
                                                {
                                                    "type": "object",
                                                    "properties": {
                                                        "contagens": {
                                                            "type": "object",
                                                            "additionalProperties": {
                                                                "type": "integer"
                                                            }
                                                        }
                                                    }
                                                }
                                            ]
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 301,
                                            "canal": "whatsapp",
                                            "canal_rotulo": "WhatsApp",
                                            "contacto": "+351912345678",
                                            "pessoa": {
                                                "tipo": "lead",
                                                "id": 812,
                                                "nome": "Ricardo Almeida"
                                            },
                                            "estado": "aberta",
                                            "estado_rotulo": "Aberta",
                                            "departamento": "comercial",
                                            "departamento_rotulo": "Comercial",
                                            "atribuida_a": {
                                                "id": 14,
                                                "nome": "Sofia Martins",
                                                "cor": "#8b5cf6"
                                            },
                                            "ia_a_tratar": false,
                                            "aguarda_resposta": true,
                                            "sla_ate": "2026-10-28T09:42:00+00:00",
                                            "atrasada": false,
                                            "ultima_mensagem_em": "2026-10-28T09:27:00+00:00",
                                            "previa": "Boa tarde, qual é o preço aproximado para a zona da coroa?",
                                            "assunto": null,
                                            "idioma": "pt-PT",
                                            "avaliacao": null
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/crm/conversas/{id}": {
            "get": {
                "tags": [
                    "Caixa de entrada"
                ],
                "operationId": "crmObterConversa",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "ver",
                "summary": "Conversa com mensagens",
                "description": "Até 400 mensagens, notas internas incluídas. Com depois_de devolve só as mensagens novas (para atualizar sem recarregar). Conteúdo de departamentos clínicos e fotografias filtrados pelas permissões. Primeira leitura auditada.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "name": "depois_de",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Só mensagens com id superior a este."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmConversaDetalhe"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 301,
                                        "canal": "whatsapp",
                                        "canal_rotulo": "WhatsApp",
                                        "contacto": "+351912345678",
                                        "pessoa": {
                                            "tipo": "lead",
                                            "id": 812,
                                            "nome": "Ricardo Almeida"
                                        },
                                        "estado": "aberta",
                                        "estado_rotulo": "Aberta",
                                        "departamento": "comercial",
                                        "departamento_rotulo": "Comercial",
                                        "atribuida_a": {
                                            "id": 14,
                                            "nome": "Sofia Martins",
                                            "cor": "#8b5cf6"
                                        },
                                        "ia_a_tratar": false,
                                        "aguarda_resposta": true,
                                        "sla_ate": "2026-10-28T09:42:00+00:00",
                                        "atrasada": false,
                                        "ultima_mensagem_em": "2026-10-28T09:27:00+00:00",
                                        "previa": "Boa tarde, qual é o preço aproximado para a zona da coroa?",
                                        "assunto": null,
                                        "idioma": "pt-PT",
                                        "avaliacao": null,
                                        "mensagens": [
                                            {
                                                "id": 9921,
                                                "direcao": "saida",
                                                "autor_tipo": "equipa",
                                                "autor": {
                                                    "id": 14,
                                                    "nome": "Sofia Martins",
                                                    "cor": "#8b5cf6"
                                                },
                                                "canal": "whatsapp",
                                                "corpo": "Olá Ricardo! O valor depende da avaliação. Podemos marcar uma consulta gratuita esta semana?",
                                                "traducao": null,
                                                "anexos": [],
                                                "estado_entrega": "entregue",
                                                "estado_entrega_rotulo": "Entregue",
                                                "idioma": "pt-PT",
                                                "ia": false,
                                                "criado_em": "2026-10-28T09:31:00+00:00"
                                            }
                                        ],
                                        "conteudo_visivel": true,
                                        "outras_conversas": [],
                                        "transferencias": [],
                                        "avaliacao_comentario": null,
                                        "respostas_rapidas": [
                                            {
                                                "id": 2,
                                                "titulo": "Horário",
                                                "atalho": "/horario",
                                                "corpo": "Estamos abertos de segunda a sexta, das 9h às 19h."
                                            }
                                        ],
                                        "canais_reenvio": [
                                            "sms",
                                            "email"
                                        ],
                                        "ia": {
                                            "traducao": true,
                                            "respostas": true
                                        },
                                        "pode_editar": true
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/crm/conversas/{id}/assumir": {
            "post": {
                "tags": [
                    "Caixa de entrada"
                ],
                "operationId": "crmAssumirConversa",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "editar",
                "summary": "Assumir a conversa",
                "description": "Só pessoas da equipa. Atribui a conversa a quem chama e desliga o assistente virtual nesta conversa.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmConversaDetalhe"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/crm/conversas/{id}/atribuir": {
            "post": {
                "tags": [
                    "Caixa de entrada"
                ],
                "operationId": "crmAtribuirConversa",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "editar",
                "summary": "Atribuir a uma pessoa",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "utilizador_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "utilizador_id": 14
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 301
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/crm/conversas/{id}/avaliacao": {
            "post": {
                "tags": [
                    "Caixa de entrada"
                ],
                "operationId": "crmComentarAvaliacao",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "editar",
                "summary": "Comentário do supervisor à avaliação",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "comentario": {
                                        "type": "string",
                                        "maxLength": 1000
                                    }
                                },
                                "required": [
                                    "comentario"
                                ]
                            },
                            "example": {
                                "comentario": "Resposta rápida e clara. Usar a resposta rápida do horário."
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 301
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/crm/conversas/{id}/estado": {
            "post": {
                "tags": [
                    "Caixa de entrada"
                ],
                "operationId": "crmEstadoConversa",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "editar",
                "summary": "Mudar o estado",
                "description": "Ao resolver, se a clínica o tiver ligado, pede ao contacto uma avaliação de 1 a 5. Uma mensagem nova reabre a conversa.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "estado": {
                                        "type": "string",
                                        "enum": [
                                            "aberta",
                                            "pendente",
                                            "resolvida"
                                        ]
                                    }
                                },
                                "required": [
                                    "estado"
                                ]
                            },
                            "example": {
                                "estado": "resolvida"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "estado": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 301,
                                        "estado": "resolvida"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/crm/conversas/{id}/mensagens": {
            "post": {
                "tags": [
                    "Caixa de entrada"
                ],
                "operationId": "crmResponderConversa",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "editar",
                "summary": "Responder ou deixar nota interna",
                "description": "Com nota=true grava uma nota só para a equipa. Sem nota, envia pelo canal da conversa (ou pelo «canal» indicado) através do serviço de envio da plataforma, que aplica as horas de silêncio, a lista de oposição e a janela de 24 h do WhatsApp. «original» guarda o texto antes da tradução. Efeitos: primeira resposta e tempo-alvo atualizados, sequências param, estado de entrega acompanhado pelos avisos do canal, auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "corpo": {
                                        "type": "string",
                                        "minLength": 1,
                                        "maxLength": 4000
                                    },
                                    "nota": {
                                        "type": "boolean"
                                    },
                                    "canal": {
                                        "type": "string",
                                        "enum": [
                                            "portal",
                                            "whatsapp",
                                            "instagram",
                                            "messenger",
                                            "email",
                                            "chat_site",
                                            "sms"
                                        ]
                                    },
                                    "original": {
                                        "type": "string",
                                        "maxLength": 4000
                                    },
                                    "anexos": {
                                        "type": "array",
                                        "items": {
                                            "type": "object",
                                            "properties": {
                                                "ficheiro_id": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    },
                                    "ia_pedido_id": {
                                        "type": "integer"
                                    }
                                },
                                "required": [
                                    "corpo"
                                ]
                            },
                            "example": {
                                "corpo": "Olá Ricardo! O valor depende da avaliação. Podemos marcar uma consulta gratuita esta semana?"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmMensagem"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 9921,
                                        "direcao": "saida",
                                        "autor_tipo": "equipa",
                                        "autor": {
                                            "id": 14,
                                            "nome": "Sofia Martins",
                                            "cor": "#8b5cf6"
                                        },
                                        "canal": "whatsapp",
                                        "corpo": "Olá Ricardo! O valor depende da avaliação. Podemos marcar uma consulta gratuita esta semana?",
                                        "traducao": null,
                                        "anexos": [],
                                        "estado_entrega": "entregue",
                                        "estado_entrega_rotulo": "Entregue",
                                        "idioma": "pt-PT",
                                        "ia": false,
                                        "criado_em": "2026-10-28T09:31:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/crm/conversas/{id}/mensagens/{mensagem_id}/reenviar": {
            "post": {
                "tags": [
                    "Caixa de entrada"
                ],
                "operationId": "crmReenviarMensagem",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "name": "mensagem_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "editar",
                "summary": "Reenviar uma mensagem que falhou",
                "description": "Reenvia pelo canal indicado (um dos canais_reenvio da conversa) ou pelo mesmo canal.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "canal": {
                                        "type": "string",
                                        "enum": [
                                            "portal",
                                            "whatsapp",
                                            "instagram",
                                            "messenger",
                                            "email",
                                            "chat_site",
                                            "sms"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "canal": "sms"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmMensagem"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/crm/conversas/{id}/sugerir": {
            "post": {
                "tags": [
                    "Caixa de entrada"
                ],
                "operationId": "crmSugerirResposta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "editar",
                "summary": "Rascunho de resposta pela IA",
                "description": "Rascunho com base no histórico e na base de conhecimento aprovada (uso «respostas»). Nunca é enviado sem revisão. 403 se o conteúdo da conversa é reservado à equipa clínica. Limite: 30 por minuto.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ok": {
                                                    "type": "boolean"
                                                },
                                                "texto": {
                                                    "type": "string"
                                                },
                                                "erro": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "pedido_id": {
                                                    "type": "integer"
                                                },
                                                "fornecedor": {
                                                    "type": "string"
                                                },
                                                "modelo": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ok": true,
                                        "texto": "Olá Ricardo! O valor depende da avaliação da zona e da área dadora. Podemos marcar uma consulta de avaliação esta semana?",
                                        "erro": null,
                                        "pedido_id": 5522,
                                        "fornecedor": "local",
                                        "modelo": "definido nas Definições"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/crm/conversas/{id}/traduzir": {
            "post": {
                "tags": [
                    "Caixa de entrada"
                ],
                "operationId": "crmTraduzir",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "editar",
                "summary": "Traduzir um texto antes de enviar",
                "description": "Usa o assistente de IA configurado para o uso «traducao» (serviço local e, se falhar, o serviço externo de recurso). Por omissão traduz para a língua da conversa. 409 quando o assistente não está configurado ou não respondeu. Limite: 60 por minuto.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "texto": {
                                        "type": "string",
                                        "maxLength": 6000
                                    },
                                    "para": {
                                        "type": "string",
                                        "enum": [
                                            "pt-PT",
                                            "pt-BR",
                                            "en",
                                            "es",
                                            "fr",
                                            "de"
                                        ]
                                    }
                                },
                                "required": [
                                    "texto"
                                ]
                            },
                            "example": {
                                "texto": "Podemos marcar a avaliação para quinta-feira às 15h?",
                                "para": "fr"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ok": {
                                                    "type": "boolean"
                                                },
                                                "texto": {
                                                    "type": "string"
                                                },
                                                "idioma_origem": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "pedido_id": {
                                                    "type": "integer"
                                                },
                                                "fornecedor": {
                                                    "type": "string"
                                                },
                                                "modelo": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ok": true,
                                        "texto": "Pouvons-nous fixer l'évaluation jeudi à 15 h ?",
                                        "idioma_origem": "pt",
                                        "pedido_id": 5521,
                                        "fornecedor": "local",
                                        "modelo": "definido nas Definições"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/crm/conversas/{id}/transferir": {
            "post": {
                "tags": [
                    "Caixa de entrada"
                ],
                "operationId": "crmTransferirConversa",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "editar",
                "summary": "Transferir para outro departamento",
                "description": "Retira o responsável, regista a transferência e deixa uma nota. Efeitos: notificação ao departamento, auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "departamento": {
                                        "type": "string",
                                        "enum": [
                                            "administracao",
                                            "medico",
                                            "enfermagem",
                                            "tecnico",
                                            "comercial",
                                            "rececao"
                                        ]
                                    },
                                    "nota": {
                                        "type": "string",
                                        "maxLength": 500
                                    }
                                },
                                "required": [
                                    "departamento"
                                ]
                            },
                            "example": {
                                "departamento": "enfermagem",
                                "nota": "Descreve vermelhidão na zona dadora."
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 301
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/crm/funil": {
            "get": {
                "tags": [
                    "Funil e leads"
                ],
                "operationId": "crmFunil",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "ver",
                "summary": "Quadro do funil",
                "description": "Fases com os cartões dos leads, totais, indicadores (em curso, por responder fora de prazo, propostas paradas, ganhos do mês, valor em aberto), objetivos do mês e opções de filtro. Respeita o âmbito do módulo: o comercial com âmbito «próprios» vê os seus leads e os sem responsável.",
                "parameters": [
                    {
                        "name": "f",
                        "in": "query",
                        "style": "deepObject",
                        "explode": true,
                        "schema": {
                            "type": "object",
                            "properties": {
                                "responsavel_id": {
                                    "type": "string",
                                    "description": "Identificador, «eu» ou «sem» (sem responsável)."
                                },
                                "origem": {
                                    "type": "string",
                                    "enum": [
                                        "site",
                                        "pre_avaliacao",
                                        "meta",
                                        "google",
                                        "whatsapp",
                                        "instagram",
                                        "messenger",
                                        "telefone",
                                        "presencial",
                                        "recomendacao",
                                        "agente_voz",
                                        "outro"
                                    ]
                                },
                                "procedimento_id": {
                                    "type": "integer"
                                },
                                "decisao": {
                                    "type": "string",
                                    "enum": [
                                        "por_decidir",
                                        "confirmado",
                                        "indeciso",
                                        "recusado"
                                    ]
                                },
                                "de": {
                                    "type": "string",
                                    "format": "date"
                                },
                                "ate": {
                                    "type": "string",
                                    "format": "date"
                                },
                                "pontuacao_min": {
                                    "type": "integer",
                                    "minimum": 0,
                                    "maximum": 100
                                },
                                "sla": {
                                    "type": "string",
                                    "enum": [
                                        "atrasado"
                                    ]
                                }
                            }
                        },
                        "description": "Filtros: f[origem]=meta&f[sla]=atrasado…"
                    },
                    {
                        "$ref": "#/components/parameters/Q"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmFunil"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "fases": [
                                            {
                                                "id": 2,
                                                "nome": "Contactado",
                                                "chave": "contactado",
                                                "tipo": "aberta",
                                                "cor": "#3b82f6",
                                                "sla_horas": 24,
                                                "total": 1,
                                                "valor": 4200,
                                                "cartoes": [
                                                    {
                                                        "id": 812,
                                                        "nome": "Ricardo Almeida",
                                                        "responsavel": {
                                                            "id": 14,
                                                            "nome": "Sofia Martins",
                                                            "cor": "#8b5cf6"
                                                        },
                                                        "origem": "meta",
                                                        "origem_rotulo": "Meta (anúncios)",
                                                        "procedimento": {
                                                            "id": 3,
                                                            "nome": "Transplante capilar FUE"
                                                        },
                                                        "proxima_acao": "Ligar para marcar consulta",
                                                        "proxima_acao_em": "2026-10-29T10:00:00+00:00",
                                                        "sla_ate": null,
                                                        "sla_atrasado": false,
                                                        "decisao": "indeciso",
                                                        "decisao_rotulo": "Indeciso",
                                                        "motivo_indecisao": "Quer decidir depois do verão.",
                                                        "valor": 4200,
                                                        "valor_em_risco": true,
                                                        "pontuacao": 55,
                                                        "proposta_parada": false,
                                                        "duplicado": false,
                                                        "paciente_id": null,
                                                        "dias_na_fase": 1,
                                                        "motivo_perda": null,
                                                        "motivo_perda_rotulo": null
                                                    }
                                                ]
                                            }
                                        ],
                                        "total": 1,
                                        "kpis": {
                                            "abertos": 37,
                                            "por_responder": 2,
                                            "paradas": 4,
                                            "ganhos_mes": 6,
                                            "valor_aberto": 98400
                                        },
                                        "pode_valores": true,
                                        "pode_editar": true,
                                        "objetivos": [
                                            {
                                                "id": 1,
                                                "metrica": "consultas_marcadas",
                                                "rotulo": "Consultas marcadas",
                                                "quem": "Sofia Martins",
                                                "alvo": 20,
                                                "atual": 13,
                                                "percentagem": 65,
                                                "moeda": false
                                            }
                                        ],
                                        "motivos_perda": [
                                            {
                                                "valor": "preco",
                                                "rotulo": "Preço"
                                            }
                                        ],
                                        "filtros": [],
                                        "ativos": []
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/crm/funil/tempos": {
            "get": {
                "tags": [
                    "Funil e leads"
                ],
                "operationId": "crmFunilTempos",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "ver",
                "summary": "Tempo em cada fase do funil",
                "description": "Média por fase e por responsável das passagens terminadas no período (omissão: 90 dias), com os leads ainda em cada fase. A passagem conta para quem é responsável quando o lead sai da fase. Também incluído em GET /crm/funil («tempos», «kpis.ciclo_medio_segundos» e o tempo médio de cada coluna).",
                "parameters": [
                    {
                        "name": "de",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Início"
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Fim"
                    },
                    {
                        "name": "funil_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Funil por mercado (0 = principal)"
                    },
                    {
                        "name": "responsavel_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Só esta pessoa"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmTemposFases"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/crm/leads": {
            "post": {
                "tags": [
                    "Funil e leads"
                ],
                "operationId": "crmCriarLead",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "summary": "Criar um lead (formulários externos, anúncios)",
                "description": "Ponto de entrada para formulários externos e anúncios de captação (Meta, Google). Normaliza telefone e email; o NIF fica só como código de pesquisa. O mesmo telefone ou email de um lead em curso atualiza esse lead em vez de duplicar (devolve-o); coincidências fracas criam o lead com «possível duplicado»; um paciente reconhecido fica ligado. Depois: fase inicial, distribuição (rotativa ou por regras, saltando ausências), tempo-alvo da primeira resposta, pontuação. Efeitos: linha do tempo, tarefas da fase, inscrição na sequência, notificação ao responsável, auditoria e webhook lead.criado.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "origem": {
                                        "type": "string",
                                        "enum": [
                                            "site",
                                            "pre_avaliacao",
                                            "meta",
                                            "google",
                                            "whatsapp",
                                            "instagram",
                                            "messenger",
                                            "telefone",
                                            "presencial",
                                            "recomendacao",
                                            "agente_voz",
                                            "outro"
                                        ]
                                    },
                                    "nome": {
                                        "type": "string",
                                        "maxLength": 160
                                    },
                                    "email": {
                                        "type": "string",
                                        "format": "email",
                                        "maxLength": 190
                                    },
                                    "telefone": {
                                        "type": "string",
                                        "maxLength": 30,
                                        "description": "Com indicativo; números portugueses sem indicativo recebem +351."
                                    },
                                    "data_nascimento": {
                                        "type": "string",
                                        "format": "date"
                                    },
                                    "nif": {
                                        "type": "string",
                                        "maxLength": 20
                                    },
                                    "idioma": {
                                        "type": "string",
                                        "enum": [
                                            "pt-PT",
                                            "pt-BR",
                                            "en",
                                            "es",
                                            "fr",
                                            "de"
                                        ]
                                    },
                                    "pais": {
                                        "type": "string",
                                        "pattern": "^[A-Za-z]{2}$"
                                    },
                                    "procedimento_id": {
                                        "type": "integer"
                                    },
                                    "campanha": {
                                        "type": "string",
                                        "maxLength": 120
                                    },
                                    "anuncio": {
                                        "type": "string",
                                        "maxLength": 120
                                    },
                                    "utm_source": {
                                        "type": "string"
                                    },
                                    "utm_medium": {
                                        "type": "string"
                                    },
                                    "utm_campaign": {
                                        "type": "string"
                                    },
                                    "utm_term": {
                                        "type": "string"
                                    },
                                    "utm_content": {
                                        "type": "string"
                                    },
                                    "clique_id": {
                                        "type": "string",
                                        "maxLength": 255,
                                        "description": "Identificador do clique no anúncio (gclid, fbclid…)."
                                    },
                                    "consentimento_contacto": {
                                        "type": "boolean"
                                    },
                                    "recomendado_por_id": {
                                        "type": "integer"
                                    },
                                    "responsavel_id": {
                                        "type": "integer"
                                    },
                                    "notas": {
                                        "type": "string",
                                        "maxLength": 4000
                                    }
                                },
                                "required": [
                                    "origem"
                                ]
                            },
                            "example": {
                                "origem": "meta",
                                "nome": "Ricardo Almeida",
                                "email": "ricardo.almeida@exemplo.pt",
                                "telefone": "912345678",
                                "idioma": "pt-PT",
                                "procedimento_id": 3,
                                "campanha": "capilar-outono",
                                "utm_source": "facebook",
                                "utm_medium": "cpc",
                                "utm_campaign": "capilar-outono",
                                "clique_id": "fb.1.1730100000.AbCdEf",
                                "consentimento_contacto": true
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmLeadDetalhe"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 812,
                                        "nome": "Ricardo Almeida",
                                        "email": "ricardo.almeida@exemplo.pt",
                                        "telefone": "+351912345678",
                                        "tel": "tel:+351912345678",
                                        "data_nascimento": null,
                                        "idioma": "pt-PT",
                                        "origem": "meta",
                                        "origem_rotulo": "Meta (anúncios)",
                                        "campanha": "capilar-outono",
                                        "utm": {
                                            "source": "facebook",
                                            "medium": "cpc",
                                            "campaign": "capilar-outono"
                                        },
                                        "procedimento": {
                                            "id": 3,
                                            "nome": "Transplante capilar FUE"
                                        },
                                        "fase": {
                                            "id": 2,
                                            "nome": "Contactado",
                                            "tipo": "aberta",
                                            "cor": "#3b82f6"
                                        },
                                        "responsavel": {
                                            "id": 14,
                                            "nome": "Sofia Martins",
                                            "cor": "#8b5cf6"
                                        },
                                        "pontuacao": 55,
                                        "decisao": "indeciso",
                                        "decisao_rotulo": "Indeciso",
                                        "motivo_indecisao": "Quer decidir depois do verão.",
                                        "valor_estimado": 4200,
                                        "motivo_perda": null,
                                        "motivo_perda_rotulo": null,
                                        "proxima_acao": "Ligar para marcar consulta",
                                        "proxima_acao_em": "2026-10-29T10:00:00+00:00",
                                        "sla_ate": null,
                                        "sla_atrasado": false,
                                        "primeira_resposta_em": "2026-10-28T09:12:00+00:00",
                                        "ultimo_contacto_em": "2026-10-28T09:12:00+00:00",
                                        "paciente_id": null,
                                        "convertido_em": null,
                                        "recomendado_por": null,
                                        "recompensa_estado": null,
                                        "consentimento_contacto": true,
                                        "marketing": {
                                            "decisao": "dado",
                                            "valido": true,
                                            "adesao_confirmada_em": "2026-10-28T09:30:00+00:00"
                                        },
                                        "notas": null,
                                        "criado_em": "2026-10-28T08:47:00+00:00",
                                        "conversas": [
                                            {
                                                "id": 301,
                                                "canal": "whatsapp",
                                                "canal_rotulo": "WhatsApp",
                                                "estado": "aberta",
                                                "estado_rotulo": "Aberta",
                                                "aguarda_resposta": false,
                                                "ultima_mensagem_em": "2026-10-28T09:12:00+00:00"
                                            }
                                        ],
                                        "chamadas": [],
                                        "cronologia": [
                                            {
                                                "titulo": "Lead criado (Meta (anúncios))",
                                                "descricao": null,
                                                "categoria": "comercial",
                                                "tipo": "lead_criado",
                                                "data": "2026-10-28T08:47:00+00:00"
                                            }
                                        ],
                                        "duplicados": [],
                                        "fases": [
                                            {
                                                "id": 1,
                                                "nome": "Novo",
                                                "tipo": "aberta",
                                                "cor": "#64748b"
                                            },
                                            {
                                                "id": 2,
                                                "nome": "Contactado",
                                                "tipo": "aberta",
                                                "cor": "#3b82f6"
                                            }
                                        ],
                                        "equipa": [
                                            {
                                                "id": 14,
                                                "nome": "Sofia Martins"
                                            }
                                        ],
                                        "motivos_perda": [
                                            {
                                                "valor": "preco",
                                                "rotulo": "Preço"
                                            }
                                        ],
                                        "decisoes": [
                                            {
                                                "valor": "confirmado",
                                                "rotulo": "Confirmado"
                                            }
                                        ],
                                        "pode_editar": true,
                                        "pode_valores": true,
                                        "pode_converter": true
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/crm/leads/{id}": {
            "get": {
                "tags": [
                    "Funil e leads"
                ],
                "operationId": "crmObterLead",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "ver",
                "summary": "Detalhe do lead",
                "description": "Dados de contacto, origem, fase, decisão, próxima ação, consentimento de marketing, conversas e chamadas recentes, cronologia comercial e possíveis duplicados. «valor_estimado» só com financeiro.valores. Leitura auditada.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmLeadDetalhe"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 812,
                                        "nome": "Ricardo Almeida",
                                        "email": "ricardo.almeida@exemplo.pt",
                                        "telefone": "+351912345678",
                                        "tel": "tel:+351912345678",
                                        "data_nascimento": null,
                                        "idioma": "pt-PT",
                                        "origem": "meta",
                                        "origem_rotulo": "Meta (anúncios)",
                                        "campanha": "capilar-outono",
                                        "utm": {
                                            "source": "facebook",
                                            "medium": "cpc",
                                            "campaign": "capilar-outono"
                                        },
                                        "procedimento": {
                                            "id": 3,
                                            "nome": "Transplante capilar FUE"
                                        },
                                        "fase": {
                                            "id": 2,
                                            "nome": "Contactado",
                                            "tipo": "aberta",
                                            "cor": "#3b82f6"
                                        },
                                        "responsavel": {
                                            "id": 14,
                                            "nome": "Sofia Martins",
                                            "cor": "#8b5cf6"
                                        },
                                        "pontuacao": 55,
                                        "decisao": "indeciso",
                                        "decisao_rotulo": "Indeciso",
                                        "motivo_indecisao": "Quer decidir depois do verão.",
                                        "valor_estimado": 4200,
                                        "motivo_perda": null,
                                        "motivo_perda_rotulo": null,
                                        "proxima_acao": "Ligar para marcar consulta",
                                        "proxima_acao_em": "2026-10-29T10:00:00+00:00",
                                        "sla_ate": null,
                                        "sla_atrasado": false,
                                        "primeira_resposta_em": "2026-10-28T09:12:00+00:00",
                                        "ultimo_contacto_em": "2026-10-28T09:12:00+00:00",
                                        "paciente_id": null,
                                        "convertido_em": null,
                                        "recomendado_por": null,
                                        "recompensa_estado": null,
                                        "consentimento_contacto": true,
                                        "marketing": {
                                            "decisao": "dado",
                                            "valido": true,
                                            "adesao_confirmada_em": "2026-10-28T09:30:00+00:00"
                                        },
                                        "notas": null,
                                        "criado_em": "2026-10-28T08:47:00+00:00",
                                        "conversas": [
                                            {
                                                "id": 301,
                                                "canal": "whatsapp",
                                                "canal_rotulo": "WhatsApp",
                                                "estado": "aberta",
                                                "estado_rotulo": "Aberta",
                                                "aguarda_resposta": false,
                                                "ultima_mensagem_em": "2026-10-28T09:12:00+00:00"
                                            }
                                        ],
                                        "chamadas": [],
                                        "cronologia": [
                                            {
                                                "titulo": "Lead criado (Meta (anúncios))",
                                                "descricao": null,
                                                "categoria": "comercial",
                                                "tipo": "lead_criado",
                                                "data": "2026-10-28T08:47:00+00:00"
                                            }
                                        ],
                                        "duplicados": [],
                                        "fases": [
                                            {
                                                "id": 1,
                                                "nome": "Novo",
                                                "tipo": "aberta",
                                                "cor": "#64748b"
                                            },
                                            {
                                                "id": 2,
                                                "nome": "Contactado",
                                                "tipo": "aberta",
                                                "cor": "#3b82f6"
                                            }
                                        ],
                                        "equipa": [
                                            {
                                                "id": 14,
                                                "nome": "Sofia Martins"
                                            }
                                        ],
                                        "motivos_perda": [
                                            {
                                                "valor": "preco",
                                                "rotulo": "Preço"
                                            }
                                        ],
                                        "decisoes": [
                                            {
                                                "valor": "confirmado",
                                                "rotulo": "Confirmado"
                                            }
                                        ],
                                        "pode_editar": true,
                                        "pode_valores": true,
                                        "pode_converter": true
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/crm/leads/{id}/atribuir": {
            "post": {
                "tags": [
                    "Funil e leads"
                ],
                "operationId": "crmAtribuirLead",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "summary": "Atribuir responsável",
                "description": "Nulo retira o responsável. A pessoa tem de pertencer à clínica. Efeitos: notificação à pessoa, auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "responsavel_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "responsavel_id": 14
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmLeadDetalhe"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/crm/leads/{id}/converter": {
            "post": {
                "tags": [
                    "Funil e leads"
                ],
                "operationId": "crmConverterLead",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "summary": "Converter em paciente",
                "description": "Cria o paciente com os dados do lead (ou usa o paciente já ligado) e abre o episódio. Idempotente: repetir devolve o mesmo paciente. 409 se o lead foi anonimizado ou a ficha clínica não está disponível. Efeitos: sequências param, linha do tempo, auditoria e webhook lead.convertido.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "lead_id": {
                                                    "type": "integer"
                                                },
                                                "paciente_id": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "lead_id": 812,
                                        "paciente_id": 1204
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    }
                }
            }
        },
        "/crm/leads/{id}/decisao": {
            "post": {
                "tags": [
                    "Funil e leads"
                ],
                "operationId": "crmDecisaoLead",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "summary": "Registar a decisão do contacto",
                "description": "Indeciso e recusado exigem o motivo. O valor estimado só é aceite de quem vê valores. Recalcula a pontuação. Efeitos: linha do tempo, auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "decisao": {
                                        "type": "string",
                                        "enum": [
                                            "por_decidir",
                                            "confirmado",
                                            "indeciso",
                                            "recusado"
                                        ]
                                    },
                                    "motivo_indecisao": {
                                        "type": "string",
                                        "maxLength": 255
                                    },
                                    "valor_estimado": {
                                        "type": [
                                            "number",
                                            "null"
                                        ],
                                        "minimum": 0,
                                        "x-unidade": "EUR"
                                    }
                                },
                                "required": [
                                    "decisao"
                                ]
                            },
                            "example": {
                                "decisao": "indeciso",
                                "motivo_indecisao": "Quer decidir depois do verão.",
                                "valor_estimado": 4200
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmLeadDetalhe"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/crm/leads/{id}/duplicados": {
            "get": {
                "tags": [
                    "Funil e leads"
                ],
                "operationId": "crmDuplicadosLead",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "ver",
                "summary": "Possíveis duplicados",
                "description": "Leads com o mesmo telefone, email, NIF ou nome e data de nascimento. «forte» = telefone ou email.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/CrmDuplicado"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "tipo": "lead",
                                            "id": 790,
                                            "nome": "Ricardo Almeida",
                                            "motivos": [
                                                "email"
                                            ],
                                            "forte": true,
                                            "convertido": false,
                                            "perdido": true
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/crm/leads/{id}/fase": {
            "post": {
                "tags": [
                    "Funil e leads"
                ],
                "operationId": "crmMudarFaseLead",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "summary": "Mudar de fase",
                "description": "Move o lead (com a posição na coluna). Para uma fase do tipo «perdida», o motivo de perda é obrigatório (422 sem ele). Efeitos: linha do tempo, tarefas automáticas da fase, inscrição/paragem de sequências, recompensa de recomendação pendente ao ganhar, auditoria e webhook lead.fase_alterada.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "fase_id": {
                                        "type": "integer"
                                    },
                                    "ordem": {
                                        "type": "integer",
                                        "minimum": 0
                                    },
                                    "motivo_perda": {
                                        "type": "string",
                                        "enum": [
                                            "preco",
                                            "prazo",
                                            "concorrencia",
                                            "nao_elegivel",
                                            "sem_resposta",
                                            "outro"
                                        ]
                                    },
                                    "motivo_perda_detalhe": {
                                        "type": "string",
                                        "maxLength": 255
                                    }
                                },
                                "required": [
                                    "fase_id"
                                ]
                            },
                            "example": {
                                "fase_id": 9,
                                "ordem": 0,
                                "motivo_perda": "preco",
                                "motivo_perda_detalhe": "Escolheu uma clínica no estrangeiro."
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmLeadDetalhe"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/crm/leads/{id}/fundir": {
            "post": {
                "tags": [
                    "Funil e leads"
                ],
                "operationId": "crmFundirLead",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "summary": "Fundir um lead repetido neste",
                "description": "Conversas, chamadas, tarefas, pedidos do agente e cronologia passam para o lead indicado no caminho; o repetido fica marcado como fundido. Efeitos: linha do tempo, auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "duplicado_id": {
                                        "type": "integer"
                                    }
                                },
                                "required": [
                                    "duplicado_id"
                                ]
                            },
                            "example": {
                                "duplicado_id": 790
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmLeadDetalhe"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/crm/leads/{id}/proxima-acao": {
            "post": {
                "tags": [
                    "Funil e leads"
                ],
                "operationId": "crmProximaAcaoLead",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "summary": "Definir a próxima ação",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "proxima_acao": {
                                        "type": "string",
                                        "maxLength": 190
                                    },
                                    "proxima_acao_em": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date-time"
                                    }
                                }
                            },
                            "example": {
                                "proxima_acao": "Ligar para marcar consulta",
                                "proxima_acao_em": "2026-10-29T10:00:00+00:00"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmLeadDetalhe"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/crm/marcador": {
            "get": {
                "tags": [
                    "Marcador e chamadas"
                ],
                "operationId": "crmMarcador",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "ver",
                "summary": "Listas de chamadas e estatísticas",
                "parameters": [
                    {
                        "name": "de",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Início do período das estatísticas (30 dias por omissão)."
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Fim do período."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "listas": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/CrmListaChamadas"
                                                    }
                                                },
                                                "estatisticas": {
                                                    "$ref": "#/components/schemas/CrmEstatisticasChamadas"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "listas": [
                                            {
                                                "id": 12,
                                                "nome": "Reativação outono",
                                                "tipo": "reativacao",
                                                "tipo_rotulo": "Reativação",
                                                "finalidade": "comercial",
                                                "estado": "ativa",
                                                "estado_rotulo": "Ativa",
                                                "total": 140,
                                                "concluidos": 38,
                                                "bloqueados": 22,
                                                "guiao_id": 4
                                            }
                                        ],
                                        "estatisticas": {
                                            "de": "2026-09-28",
                                            "ate": "2026-10-28",
                                            "totais": {
                                                "atendidas": 412,
                                                "perdidas": 37,
                                                "fora_horas": 51,
                                                "saida": 260,
                                                "por_devolver": 3
                                            },
                                            "por_pessoa": [],
                                            "calor": [
                                                {
                                                    "x": "10h",
                                                    "serie": "Seg",
                                                    "y": 14
                                                }
                                            ]
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/crm/marcador/contactos/{id}/resultado": {
            "post": {
                "tags": [
                    "Marcador e chamadas"
                ],
                "operationId": "crmResultadoChamada",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "summary": "Registar o resultado da chamada",
                "description": "Quando a pessoa atendeu e a lista tem guião, exige a confirmação da abertura (identificação e finalidade) e os campos obrigatórios do guião. «ligar_mais_tarde» exige reagendar_em; «nao_atendeu» volta à fila até ao máximo de tentativas; «pediu_nao_contactar» coloca o número na lista de oposição e revoga o consentimento de marketing; «marcou_consulta» move o lead para a fase de consulta marcada. Efeitos: chamada atualizada, linha do tempo, auditoria; a lista conclui-se quando não restam contactos.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "resultado": {
                                        "type": "string",
                                        "enum": [
                                            "marcou_consulta",
                                            "interessado",
                                            "ligar_mais_tarde",
                                            "sem_interesse",
                                            "nao_atendeu",
                                            "numero_errado",
                                            "pediu_nao_contactar",
                                            "confirmou",
                                            "remarcou",
                                            "cancelou"
                                        ]
                                    },
                                    "abertura_feita": {
                                        "type": "boolean"
                                    },
                                    "respostas": {
                                        "type": "object",
                                        "additionalProperties": true,
                                        "description": "Chave do campo do guião → valor."
                                    },
                                    "notas": {
                                        "type": "string",
                                        "maxLength": 4000
                                    },
                                    "reagendar_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "duracao_s": {
                                        "type": "integer",
                                        "minimum": 0,
                                        "x-unidade": "s"
                                    }
                                },
                                "required": [
                                    "resultado"
                                ]
                            },
                            "example": {
                                "resultado": "marcou_consulta",
                                "abertura_feita": true,
                                "respostas": {
                                    "data_preferida": "2026-11-05",
                                    "financiamento": "nao"
                                },
                                "notas": "Prefere manhãs.",
                                "duracao_s": 184
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmContactoMarcador"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 4410,
                                        "campanha_id": 12,
                                        "nome": "Helena Duarte",
                                        "telefone": "+351936000111",
                                        "paciente_id": 702,
                                        "lead_id": null,
                                        "estado": "concluido",
                                        "estado_rotulo": "Concluído",
                                        "resultado": "marcou_consulta",
                                        "resultado_rotulo": "Marcou consulta",
                                        "motivo_bloqueio": null,
                                        "tentativas": 1,
                                        "proxima_tentativa_em": null,
                                        "respostas": [],
                                        "notas": null,
                                        "finalidade": "comercial",
                                        "tel": "tel:+351936000111"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/crm/marcador/ligar": {
            "post": {
                "tags": [
                    "Marcador e chamadas"
                ],
                "operationId": "crmLigar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "summary": "Ligar (clique para ligar)",
                "description": "Regista a chamada de saída. Se a clínica configurou o endereço da central, pede-lhe a chamada (fornecedor = true); senão devolve o endereço tel: para o telefone do aparelho. Bloqueia (422) chamadas comerciais sem consentimento ou para números na lista de oposição. Limite: 120 por minuto.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "numero": {
                                        "type": "string",
                                        "maxLength": 30
                                    },
                                    "contacto_id": {
                                        "type": "integer"
                                    },
                                    "paciente_id": {
                                        "type": "integer"
                                    },
                                    "lead_id": {
                                        "type": "integer"
                                    }
                                },
                                "required": [
                                    "numero"
                                ]
                            },
                            "example": {
                                "numero": "+351936000111",
                                "contacto_id": 4410
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "tel": {
                                                    "type": "string"
                                                },
                                                "fornecedor": {
                                                    "type": "boolean",
                                                    "description": "true quando a central da clínica fez a chamada; false → abrir o endereço tel: no aparelho."
                                                },
                                                "chamada_id": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "tel": "tel:+351936000111",
                                        "fornecedor": false,
                                        "chamada_id": 30551
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/crm/marcador/{id}": {
            "get": {
                "tags": [
                    "Marcador e chamadas"
                ],
                "operationId": "crmListaChamadas",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "ver",
                "summary": "Lista com guião e contactos",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "allOf": [
                                                {
                                                    "$ref": "#/components/schemas/CrmListaChamadas"
                                                },
                                                {
                                                    "type": "object",
                                                    "properties": {
                                                        "guiao": {
                                                            "$ref": "#/components/schemas/CrmGuiao"
                                                        },
                                                        "contactos": {
                                                            "type": "array",
                                                            "items": {
                                                                "$ref": "#/components/schemas/CrmContactoMarcador"
                                                            }
                                                        },
                                                        "resultados": {
                                                            "type": "array",
                                                            "items": {
                                                                "type": "object",
                                                                "properties": {
                                                                    "valor": {
                                                                        "type": "string"
                                                                    },
                                                                    "rotulo": {
                                                                        "type": "string"
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            ]
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/crm/marcador/{id}/estado": {
            "post": {
                "tags": [
                    "Marcador e chamadas"
                ],
                "operationId": "crmEstadoLista",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "summary": "Ativar, pausar ou concluir a lista",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "estado": {
                                        "type": "string",
                                        "enum": [
                                            "ativa",
                                            "pausada",
                                            "concluida"
                                        ]
                                    }
                                },
                                "required": [
                                    "estado"
                                ]
                            },
                            "example": {
                                "estado": "pausada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "estado": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 12,
                                        "estado": "pausada"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/crm/marcador/{id}/gerar": {
            "post": {
                "tags": [
                    "Marcador e chamadas"
                ],
                "operationId": "crmGerarLista",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "summary": "Gerar os contactos da lista",
                "description": "Aplica o filtro da lista (reativação, confirmações, propostas paradas, pós-operatório ou leads de uma fase). Nas listas comerciais bloqueia os contactos sem consentimento de marketing nem exceção de cliente e os da lista de oposição (motivo_bloqueio). Uma lista em rascunho passa a ativa.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "total": {
                                                    "type": "integer"
                                                },
                                                "bloqueados": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "total": 140,
                                        "bloqueados": 22
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/crm/marcador/{id}/seguinte": {
            "get": {
                "tags": [
                    "Marcador e chamadas"
                ],
                "operationId": "crmContactoSeguinte",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "summary": "Contacto seguinte",
                "description": "Reserva o próximo contacto pendente (ou reagendado cuja hora chegou) para quem chama. Volta a verificar o consentimento: um contacto que deixou de poder ser chamado é bloqueado e salta-se para o seguinte. dados = null quando a lista terminou.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "oneOf": [
                                                {
                                                    "$ref": "#/components/schemas/CrmContactoMarcador"
                                                },
                                                {
                                                    "type": "null"
                                                }
                                            ]
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 4410,
                                        "campanha_id": 12,
                                        "nome": "Helena Duarte",
                                        "telefone": "+351936000111",
                                        "paciente_id": 702,
                                        "lead_id": null,
                                        "estado": "em_curso",
                                        "estado_rotulo": "Em curso",
                                        "resultado": null,
                                        "resultado_rotulo": null,
                                        "motivo_bloqueio": null,
                                        "tentativas": 0,
                                        "proxima_tentativa_em": null,
                                        "respostas": [],
                                        "notas": null,
                                        "finalidade": "comercial",
                                        "tel": "tel:+351936000111"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/crm/telefonia/ao-vivo": {
            "get": {
                "tags": [
                    "Marcador e chamadas"
                ],
                "operationId": "crmTelefoniaAoVivo",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "ver",
                "summary": "Chamadas ao vivo",
                "description": "Chamadas a tocar e em curso da clínica com a ficha do contacto (nome, responsável, tarefas abertas, último contacto). «controlo»: a central aceita comandos.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "instalado": {
                                                    "type": "boolean"
                                                },
                                                "controlo": {
                                                    "type": "boolean"
                                                },
                                                "chamadas": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/CrmChamadaAoVivo"
                                                    }
                                                },
                                                "atualizado_em": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/crm/telefonia/chamadas/{id}/controlo": {
            "post": {
                "tags": [
                    "Marcador e chamadas"
                ],
                "operationId": "crmTelefoniaControlo",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "summary": "Atender, transferir ou desligar pela central",
                "description": "Envia o comando ao endereço da central (crm.telefonia.controlo_url, https). Atender liga à extensão pessoal de quem pede; transferir aceita utilizador_id, departamento ou extensao. 409 sem endereço configurado ou fora de produção; 502 se a central recusar. Auditado.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "acao": {
                                        "type": "string",
                                        "enum": [
                                            "atender",
                                            "transferir",
                                            "desligar"
                                        ]
                                    },
                                    "utilizador_id": {
                                        "type": "integer"
                                    },
                                    "departamento": {
                                        "type": "string",
                                        "enum": [
                                            "rececao",
                                            "comercial",
                                            "enfermagem",
                                            "medico",
                                            "tecnico",
                                            "administracao"
                                        ]
                                    },
                                    "extensao": {
                                        "type": "string",
                                        "pattern": "^\\+?[0-9*#]{2,20}$"
                                    }
                                },
                                "required": [
                                    "acao"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "acao": {
                                                    "type": "string"
                                                },
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "502": {
                        "description": "A central recusou o comando"
                    }
                }
            }
        },
        "/crm/telefonia/numeros": {
            "get": {
                "tags": [
                    "Marcador e chamadas"
                ],
                "operationId": "crmTelefoniaNumeros",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "ver",
                "summary": "Resultados por número da clínica",
                "parameters": [
                    {
                        "name": "de",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Início (omissão: 30 dias)"
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Fim"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "integer"
                                                    },
                                                    "numero": {
                                                        "type": "string"
                                                    },
                                                    "nome": {
                                                        "type": "string"
                                                    },
                                                    "origem": {
                                                        "type": "string"
                                                    },
                                                    "campanha": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "ativo": {
                                                        "type": "boolean"
                                                    },
                                                    "chamadas": {
                                                        "type": "integer"
                                                    },
                                                    "atendidas": {
                                                        "type": "integer"
                                                    },
                                                    "perdidas": {
                                                        "type": "integer"
                                                    },
                                                    "leads": {
                                                        "type": "integer"
                                                    },
                                                    "convertidos": {
                                                        "type": "integer"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/crm/voz/menus/{id}": {
            "get": {
                "tags": [
                    "Marcador e chamadas"
                ],
                "operationId": "crmVozMenu",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "ver",
                "summary": "Menu de voz para o editor",
                "description": "Dados gerais, árvore validada, horário, dias fechados, fora de horas, feriado, números ligados, momento atual e as opções do editor (destinos, departamentos com a extensão, línguas, teclas, mensagens gravadas). 503 «por_instalar» antes da migração.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmMenuVozEditor"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            },
            "put": {
                "tags": [
                    "Marcador e chamadas"
                ],
                "operationId": "crmVozMenuGravar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "summary": "Gravar e publicar um menu de voz",
                "description": "Grava o menu inteiro e publica uma versão nova (a central usa-a de imediato). Erros por campo (nos.N.opcoes.M.tecla, inicio…). Um só menu principal por clínica. Auditado.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "nome": {
                                        "type": "string"
                                    },
                                    "descricao": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "ativo": {
                                        "type": "boolean"
                                    },
                                    "predefinido": {
                                        "type": "boolean"
                                    },
                                    "lingua": {
                                        "type": "string",
                                        "enum": [
                                            "pt-PT",
                                            "pt-BR",
                                            "en",
                                            "es",
                                            "fr",
                                            "de"
                                        ]
                                    },
                                    "reconhecido": {
                                        "type": "string",
                                        "enum": [
                                            "menu",
                                            "gestor",
                                            "agente"
                                        ]
                                    },
                                    "aviso_gravacao": {
                                        "type": "boolean"
                                    },
                                    "usar_horario_clinica": {
                                        "type": "boolean"
                                    },
                                    "horario": {
                                        "type": "object"
                                    },
                                    "feriados": {
                                        "type": "array",
                                        "items": {
                                            "type": "object",
                                            "properties": {
                                                "data": {
                                                    "type": "string",
                                                    "format": "date"
                                                },
                                                "nome": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    },
                                    "fora_horas": {
                                        "type": "object"
                                    },
                                    "feriado": {
                                        "type": "object"
                                    },
                                    "arvore": {
                                        "$ref": "#/components/schemas/CrmMenuVozArvore"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmMenuVozEditor"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/crm/voz/menus/{id}/ouvir": {
            "post": {
                "tags": [
                    "Marcador e chamadas"
                ],
                "operationId": "crmVozMenuOuvir",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "summary": "Ouvir a mensagem de um passo",
                "description": "Fala sintetizada do texto (≤ 600 caracteres, sem dados de pacientes) na língua escolhida, com o mesmo serviço de fala das chamadas. 503 «fala_indisponivel» se nenhum serviço de fala responder.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "texto": {
                                        "type": "string"
                                    },
                                    "lingua": {
                                        "type": "string",
                                        "enum": [
                                            "pt-PT",
                                            "pt-BR",
                                            "en",
                                            "es",
                                            "fr",
                                            "de"
                                        ]
                                    }
                                },
                                "required": [
                                    "texto"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mime": {
                                                    "type": "string"
                                                },
                                                "formato": {
                                                    "type": "string",
                                                    "enum": [
                                                        "wav",
                                                        "mp3"
                                                    ]
                                                },
                                                "duracao_ms": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                },
                                                "servico": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "base64": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/crm/voz/menus/{id}/simular": {
            "post": {
                "tags": [
                    "Marcador e chamadas"
                ],
                "operationId": "crmVozMenuSimular",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "ver",
                "summary": "Simular uma chamada no menu",
                "description": "Corre as entradas por ordem («1», «#», texto dito ou vazio = sem resposta) sobre o menu gravado ou sobre a árvore enviada (ainda por gravar), com o momento e o número de quem liga opcionais. Não liga a ninguém nem gera fala.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "entradas": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        }
                                    },
                                    "telefone": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "momento": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "enum": [
                                            "aberto",
                                            "fora_horas",
                                            "feriado",
                                            null
                                        ]
                                    },
                                    "lingua": {
                                        "type": "string",
                                        "enum": [
                                            "pt-PT",
                                            "pt-BR",
                                            "en",
                                            "es",
                                            "fr",
                                            "de"
                                        ]
                                    },
                                    "arvore": {
                                        "$ref": "#/components/schemas/CrmMenuVozArvore"
                                    }
                                }
                            },
                            "example": {
                                "entradas": [
                                    "2",
                                    "pós-operatório",
                                    ""
                                ],
                                "momento": "aberto",
                                "lingua": "pt-PT"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "passos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "entrada": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "tipo": {
                                                                "type": "string"
                                                            },
                                                            "tipo_rotulo": {
                                                                "type": "string"
                                                            },
                                                            "no": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "titulo": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "texto": {
                                                                "type": "string"
                                                            },
                                                            "gravacao_id": {
                                                                "type": [
                                                                    "integer",
                                                                    "null"
                                                                ]
                                                            },
                                                            "teclas": {
                                                                "type": "array",
                                                                "items": {
                                                                    "type": "string"
                                                                }
                                                            },
                                                            "destino": {
                                                                "type": [
                                                                    "object",
                                                                    "null"
                                                                ]
                                                            },
                                                            "destino_rotulo": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            }
                                                        }
                                                    }
                                                },
                                                "fim": {
                                                    "type": "boolean"
                                                },
                                                "lingua": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/crm/voz/vozes": {
            "get": {
                "tags": [
                    "Agente de IA"
                ],
                "operationId": "crmVozVozes",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "ver",
                "summary": "Vozes por língua e variante",
                "description": "Para cada língua: se o agente fala nela, quem ouve e quem fala (serviço local, externo ou a voz da central), a voz configurada, avisos (voz brasileira para pt-PT, serviço local sem pt-PT…) e o último teste. Sem nomes de modelos.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmVozesLinguas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/crm/voz/vozes/testar": {
            "post": {
                "tags": [
                    "Agente de IA"
                ],
                "operationId": "crmVozTestar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "editar",
                "summary": "Testar a voz de uma língua",
                "description": "Fala uma frase típica da variante, ouve-a de volta e compara (semelhança, língua e variante detetadas, avisos). O áudio vem em base64 para ouvir. Sem dados de pacientes. Auditado.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "lingua": {
                                        "type": "string",
                                        "enum": [
                                            "pt-PT",
                                            "pt-BR",
                                            "en",
                                            "es",
                                            "fr",
                                            "de"
                                        ]
                                    }
                                },
                                "required": [
                                    "lingua"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "lingua": {
                                                    "type": "string"
                                                },
                                                "frase": {
                                                    "type": "string"
                                                },
                                                "ok": {
                                                    "type": "boolean"
                                                },
                                                "audio": {
                                                    "type": [
                                                        "object",
                                                        "null"
                                                    ]
                                                },
                                                "servico_fala": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "servico_ouvir": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "voz": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "ouvido": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "semelhanca": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                },
                                                "lingua_detetada": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "variante_detetada": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "avisos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "avisos_rotulos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/definicoes": {
            "get": {
                "tags": [
                    "Definições"
                ],
                "operationId": "definicoes",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Grupos de definições com os valores",
                "description": "Cada campo: {chave, tipo, rotulo, ajuda, secao, padrao, opcoes, min, max, obrigatorio, valor, definido}. Os segredos nunca vêm em claro: valor null e definido true|false.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "grupo": {
                                                        "type": "string"
                                                    },
                                                    "titulo": {
                                                        "type": "string"
                                                    },
                                                    "descricao": {
                                                        "type": "string"
                                                    },
                                                    "editavel": {
                                                        "type": "boolean"
                                                    },
                                                    "campos": {
                                                        "type": "array",
                                                        "items": {
                                                            "type": "object"
                                                        }
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            },
            "put": {
                "tags": [
                    "Definições"
                ],
                "operationId": "gravarDefinicoes",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Gravar definições de um grupo",
                "description": "Segredo vazio mantém o valor; para apagar um segredo envie limpar:{chave:true}.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "grupo": {
                                        "type": "string"
                                    },
                                    "valores": {
                                        "type": "object",
                                        "additionalProperties": true
                                    },
                                    "limpar": {
                                        "type": "object",
                                        "additionalProperties": {
                                            "type": "boolean"
                                        }
                                    }
                                },
                                "required": [
                                    "grupo",
                                    "valores"
                                ]
                            },
                            "example": {
                                "grupo": "seguranca",
                                "valores": {
                                    "seguranca.sessao_minutos": 30
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/definicoes/email/testar": {
            "post": {
                "tags": [
                    "Definições"
                ],
                "operationId": "testarEmail",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "summary": "Enviar email de teste",
                "description": "«plataforma» exige superadministrador; «clinica» exige Definições › Editar. Usa os dados gravados desse servidor. Falhas devolvem ok:false com categoria (incompleto, ligacao, autenticacao, cifra, remetente, tempo, outro) e mensagem legível. Nunca devolve a palavra-passe. Auditado.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "ambito": {
                                        "type": "string",
                                        "enum": [
                                            "plataforma",
                                            "clinica"
                                        ]
                                    },
                                    "para": {
                                        "type": "string",
                                        "format": "email"
                                    }
                                },
                                "required": [
                                    "ambito",
                                    "para"
                                ]
                            },
                            "example": {
                                "ambito": "clinica",
                                "para": "geral@clinicaporto.pt"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoEmailTeste"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ok": true,
                                        "categoria": "ok",
                                        "mensagem": "Email de teste enviado para geral@clinicaporto.pt.",
                                        "servidor": "smtp.clinicaporto.pt",
                                        "porta": 587,
                                        "cifra": "tls",
                                        "remetente": "geral@clinicaporto.pt",
                                        "utilizador": "ge•••@clinicaporto.pt"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/emergencia": {
            "post": {
                "tags": [
                    "Sessão"
                ],
                "operationId": "acessoEmergencia",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Pedir acesso de emergência a um paciente",
                "description": "Quando um pedido devolve 403 com erro.paciente_id, a app pode oferecer este pedido. Motivo obrigatório (20 a 1000 caracteres). O acesso é temporário (Definições › Segurança), fica registado na auditoria e é revisto pela administração. Perfis cujo teto de proteção de dados impede o acesso clínico não o podem pedir.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "paciente_id": {
                                        "type": "integer"
                                    },
                                    "motivo": {
                                        "type": "string",
                                        "minLength": 20,
                                        "maxLength": 1000
                                    }
                                },
                                "required": [
                                    "paciente_id",
                                    "motivo"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "paciente_id": {
                                                    "type": "integer"
                                                },
                                                "inicio": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                },
                                                "fim": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                },
                                                "estado": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/eu": {
            "get": {
                "tags": [
                    "Sessão"
                ],
                "operationId": "eu",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "paciente": []
                    },
                    {
                        "integracao": []
                    }
                ],
                "summary": "Quem sou (conta, clínica, permissões efetivas, preferências)",
                "description": "Equipa: conta, global, clinicas, permissoes (módulo → {nivel, ambito, aprovar, exportar}), modulos_ativos, emergencias, preferencias. Paciente: conta e preferências. Integração: cliente e permissões dos âmbitos.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    }
                }
            }
        },
        "/eu/clinica": {
            "post": {
                "tags": [
                    "Sessão"
                ],
                "operationId": "mudarClinica",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Mudar de clínica (só utilizadores globais)",
                "description": "A escolha fica associada à sessão da app; em alternativa, envie X-AX-Clinica em cada pedido.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "clinica_id": {
                                        "type": "integer"
                                    }
                                },
                                "required": [
                                    "clinica_id"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "clinica_id": {
                                                    "type": "integer"
                                                },
                                                "nome": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/execucoes/cirurgias/{cirurgia_id}": {
            "get": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "execucaoDaCirurgia",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "bloco.registo:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "cirurgia_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "ver",
                "summary": "Áreas do dia 0 e implantado por zona",
                "description": "Criada a partir do plano aprovado na primeira leitura (zonas incluídas da 1.ª fase). Ver: bloco.registo ver ou ficha.plano ver; densidades só com ficha.plano ver.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Execucao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/execucoes/{id}/areas": {
            "post": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "confirmarAreasDia0",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "editar",
                "summary": "Confirmar as áreas do dia 0",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "zonas": {
                                        "type": "array",
                                        "items": {
                                            "type": "object"
                                        }
                                    },
                                    "captura_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "zonas"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Execucao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/execucoes/{id}/areas/calcular": {
            "post": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "calcularAreasDia0",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "bloco.registo:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "ver",
                "summary": "Recalcular com as áreas do dia 0 (sem gravar)",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "zonas": {
                                        "type": "array",
                                        "items": {
                                            "type": "object",
                                            "properties": {
                                                "zona": {
                                                    "type": "string"
                                                },
                                                "area_cm2": {
                                                    "oneOf": [
                                                        {
                                                            "type": "number"
                                                        },
                                                        {
                                                            "$ref": "#/components/schemas/ValorComUnidade"
                                                        },
                                                        {
                                                            "type": "null"
                                                        }
                                                    ]
                                                },
                                                "origem_area": {
                                                    "type": "string",
                                                    "enum": [
                                                        "manual",
                                                        "modelo3d",
                                                        "diagrama"
                                                    ]
                                                }
                                            }
                                        }
                                    }
                                },
                                "required": [
                                    "zonas"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Execucao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/execucoes/{id}/implantados": {
            "post": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "implantadosPorZona",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "bloco.registo:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "summary": "Registar o implantado por zona",
                "description": "Com planeamento.dia0_confirmar_antes, exige as áreas confirmadas.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "zonas": {
                                        "type": "array",
                                        "items": {
                                            "type": "object",
                                            "properties": {
                                                "zona": {
                                                    "type": "string"
                                                },
                                                "enxertos_implantados": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        }
                                    },
                                    "notas": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "zonas"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Execucao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/execucoes/{id}/real": {
            "post": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "atualizarRealExecucao",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "bloco.registo:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "ver",
                "summary": "Reler as contagens do painel (cabelos por enxerto reais)",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Execucao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/exportacoes": {
            "get": {
                "tags": [
                    "Exportação"
                ],
                "operationId": "listarExportacoesTotais",
                "summary": "Exportações totais da clínica",
                "description": "Estado de cada pedido (pedido, a_gerar, concluida, erro, expirada), tamanho, tabelas, SHA-256 e ligação assinada de 15 min para descarregar no navegador.",
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Exportacao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            },
            "post": {
                "tags": [
                    "Exportação"
                ],
                "operationId": "pedirExportacaoTotal",
                "summary": "Pedir exportação total",
                "description": "ZIP com um CSV por tabela da clínica, manifesto (tabelas, colunas, linhas, SHA-256) e lista de ficheiros. Credenciais e segredos nunca são exportados; campos cifrados saem cifrados. Gerado em segundo plano; um pedido de cada vez.\n\nEfeitos: auditoria (com o motivo); notificação a quem pediu e webhook exportacao.concluida quando fica pronto.",
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "motivo"
                                ],
                                "properties": {
                                    "motivo": {
                                        "type": "string",
                                        "minLength": 5,
                                        "maxLength": 255
                                    }
                                }
                            },
                            "example": {
                                "motivo": "Cópia anual para arquivo"
                            }
                        }
                    }
                },
                "responses": {
                    "202": {
                        "description": "Aceite para processamento",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "estado": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 4,
                                        "estado": "pedido"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/ficheiros": {
            "post": {
                "tags": [
                    "Ficheiros"
                ],
                "operationId": "carregarFicheiro",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "paciente": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Carregar ficheiro",
                "description": "Tipo real verificado pelo conteúdo; nome substituído por um aleatório; imagens sem metadados de localização; ficheiros clínicos cifrados em repouso. Limites em Definições › Segurança.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ficheiro"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary"
                                    },
                                    "categoria": {
                                        "type": "string"
                                    },
                                    "paciente_id": {
                                        "type": "integer"
                                    },
                                    "clinico": {
                                        "type": "integer",
                                        "enum": [
                                            0,
                                            1
                                        ]
                                    },
                                    "modulo": {
                                        "type": "string"
                                    },
                                    "dono_tipo": {
                                        "type": "string"
                                    },
                                    "dono_id": {
                                        "type": "integer"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "paciente_id": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                },
                                                "categoria": {
                                                    "type": "string"
                                                },
                                                "nome_original": {
                                                    "type": "string"
                                                },
                                                "mime": {
                                                    "type": "string"
                                                },
                                                "tipo_logico": {
                                                    "type": "string"
                                                },
                                                "tamanho": {
                                                    "type": "integer"
                                                },
                                                "sha256": {
                                                    "type": "string"
                                                },
                                                "largura": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                },
                                                "altura": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                },
                                                "clinico": {
                                                    "type": "boolean"
                                                },
                                                "origem": {
                                                    "type": "string"
                                                },
                                                "criado_em": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                },
                                                "url": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/ficheiros/{id}/url": {
            "get": {
                "tags": [
                    "Ficheiros"
                ],
                "operationId": "urlFicheiro",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "paciente": []
                    }
                ],
                "summary": "Ligação assinada (15 minutos)",
                "description": "A ligação volta a verificar as permissões de quem a pediu quando é aberta.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "descarregar",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "enum": [
                                0,
                                1
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "url": {
                                                    "type": "string"
                                                },
                                                "expira_em": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                },
                                                "mime": {
                                                    "type": "string"
                                                },
                                                "nome": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/formularios/biblioteca": {
            "get": {
                "tags": [
                    "Formulários"
                ],
                "operationId": "m1BibliotecaFormularios",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "ver",
                "summary": "Modelos prontos a adaptar",
                "description": "Formulários marcados como modelo (até 200), por tipo e nome, com o número de perguntas e de passos. Para usar um, duplica-se (POST /formularios/{id}/duplicar). Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "allOf": [
                                                    {
                                                        "$ref": "#/components/schemas/M1Formulario"
                                                    },
                                                    {
                                                        "type": "object",
                                                        "properties": {
                                                            "perguntas": {
                                                                "type": "integer"
                                                            },
                                                            "passos": {
                                                                "type": "integer"
                                                            }
                                                        }
                                                    }
                                                ]
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 3,
                                            "chave": "questionario_previo",
                                            "nome": "Questionário prévio",
                                            "descricao": "A preencher antes da primeira consulta.",
                                            "tipo": "questionario_previo",
                                            "tipo_rotulo": "Questionário prévio",
                                            "tecnica": null,
                                            "versao": 1,
                                            "idioma": "pt-PT",
                                            "ativo": true,
                                            "modelo": true,
                                            "expira_dias": 14,
                                            "publicado_em": "2026-10-20T15:40:00+01:00",
                                            "perguntas": 24,
                                            "passos": 4
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/formularios/ficheiro": {
            "post": {
                "tags": [
                    "Formulários"
                ],
                "operationId": "m1FicheiroFormularioEquipa",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Carregar a fotografia de uma pergunta (equipa)",
                "description": "Igual a POST equipa/formularios/ficheiro na web. Só imagens, até 15 MB: tipo real verificado pelos bytes, extensões executáveis recusadas, nome aleatório, guardada fora da área pública como ficheiro clínico do paciente. Nenhuma fotografia é recolhida antes da autorização «fotografias_clinicas»: já registada para o paciente ou declarada agora em consentimento_fotos = 1 (senão 422 em «ficheiro»). Paciente indicado tem de existir (422) e estar no âmbito clínico (403). Devolve o identificador a usar na resposta da pergunta. Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After). Limite adicional: 60 pedidos por 10 minutos por endereço IP (contam só os pedidos que alteram dados).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ficheiro"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary",
                                        "description": "Imagem até 15 MB"
                                    },
                                    "paciente_id": {
                                        "type": "integer"
                                    },
                                    "consentimento_fotos": {
                                        "type": "string",
                                        "enum": [
                                            "0",
                                            "1"
                                        ],
                                        "description": "1 quando a autorização para as fotografias foi declarada neste preenchimento."
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "nome": {
                                                    "type": "string"
                                                },
                                                "nome_original": {
                                                    "type": "string"
                                                },
                                                "url": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 9051,
                                        "nome": "frontal.jpg",
                                        "nome_original": "frontal.jpg",
                                        "url": "https://clinica.exemplo.pt/ficheiros/9051?assinatura=…"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/formularios/respostas/{id}": {
            "get": {
                "tags": [
                    "Formulários"
                ],
                "operationId": "m1ObterRespostaFormulario",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "ver",
                "summary": "Resposta legível",
                "description": "Equipa e integrações. Resposta com o esquema da sua versão, os valores, os itens formatados (pergunta, secção, texto legível, alarme), a origem, o estado, a pontuação e a faixa, quem validou e o pedido de informação da devolução. Respostas de um paciente exigem o paciente no âmbito clínico. Leitura auditada («ver», formularios_respostas). Paciente fora do âmbito: 403 «sem_permissao» com erro.paciente_id (a app oferece o acesso de emergência). Limite (por omissão): 120 pedidos por minuto por token da equipa; nas integrações vale o limite por minuto definido no cliente de integração (429 com Retry-After).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da resposta (formularios_respostas)"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1RespostaFormulario"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/formularios/{id}/duplicar": {
            "post": {
                "tags": [
                    "Formulários"
                ],
                "operationId": "m1DuplicarFormulario",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do formulário"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Cópia editável",
                "description": "Cria um formulário novo (versão 1, inativo, não modelo) com o esquema, o tipo, a técnica, o idioma e o prazo do original; chave nova derivada da original; nome indicado ou «Cópia de …» (até 160). Efeitos: cópia da versão, auditoria «criar». Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "nome": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "maxLength": 160
                                    }
                                }
                            },
                            "example": {
                                "nome": "Questionário prévio — FUE"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1Formulario"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 32,
                                        "chave": "questionario_previo_c482913",
                                        "nome": "Questionário prévio — FUE",
                                        "descricao": "A preencher antes da primeira consulta.",
                                        "tipo": "questionario_previo",
                                        "tipo_rotulo": "Questionário prévio",
                                        "tecnica": "FUE",
                                        "versao": 1,
                                        "idioma": "pt-PT",
                                        "ativo": false,
                                        "modelo": false,
                                        "expira_dias": 14,
                                        "publicado_em": "2026-10-20T15:40:00+01:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/formularios/{id}/editor": {
            "get": {
                "tags": [
                    "Formulários"
                ],
                "operationId": "m1EditorFormulario",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "ver",
                "summary": "Formulário para o construtor",
                "description": "Formulário, esquema atual, catálogo dos 12 tipos de pergunta, versões publicadas (até 50), traduções (mesma chave noutros idiomas), número de respostas recebidas, se quem pede pode editar e se a tradução pelo assistente de IA da clínica está configurada. Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do formulário"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1EditorFormulario"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/formularios/{id}/esquema": {
            "put": {
                "tags": [
                    "Formulários"
                ],
                "operationId": "m1GravarEsquemaFormulario",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Gravar o esquema (nova versão se já houver respostas)",
                "description": "Valida e normaliza o esquema: 1 a 20 passos, até 300 perguntas, tipos da lista fechada, chaves únicas no formato a-z0-9_, opções e colunas no formato próprio, condições só para perguntas existentes (as outras são descartadas), até 10 faixas de pontuação; erros por pergunta → 422 com «pergunta_N». Se a versão atual já tem respostas, publica uma versão nova (as respostas antigas continuam ligadas ao esquema da sua versão). Também aceita nome (até 160), descricao (até 400), expira_dias (1–365; 0 ou vazio = prazo das definições) e ativo. Efeitos: cópia da versão, auditoria «alterar». Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do formulário"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "esquema": {
                                        "$ref": "#/components/schemas/M1EsquemaFormulario"
                                    },
                                    "nome": {
                                        "type": "string",
                                        "maxLength": 160
                                    },
                                    "descricao": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "maxLength": 400
                                    },
                                    "expira_dias": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "minimum": 0,
                                        "maximum": 365
                                    },
                                    "ativo": {
                                        "type": "boolean"
                                    }
                                },
                                "required": [
                                    "esquema"
                                ]
                            },
                            "example": {
                                "esquema": {
                                    "passos": [
                                        {
                                            "chave": "p1",
                                            "titulo": "Saúde geral",
                                            "descricao": "",
                                            "seccoes": [
                                                {
                                                    "chave": "s1_1",
                                                    "titulo": "Antecedentes",
                                                    "descricao": "",
                                                    "perguntas": [
                                                        {
                                                            "chave": "anticoagulantes",
                                                            "tipo": "simnao",
                                                            "rotulo": "Toma anticoagulantes?",
                                                            "ajuda": "",
                                                            "obrigatorio": true,
                                                            "preencher": true,
                                                            "pontos_sim": null,
                                                            "alarme_sim": true,
                                                            "alerta": {
                                                                "tipo": "anticoagulante",
                                                                "gravidade": "alta",
                                                                "quando": [
                                                                    "sim"
                                                                ]
                                                            }
                                                        },
                                                        {
                                                            "chave": "qual_anticoagulante",
                                                            "tipo": "texto",
                                                            "rotulo": "Qual?",
                                                            "ajuda": "",
                                                            "obrigatorio": false,
                                                            "preencher": true,
                                                            "max": 200,
                                                            "condicao": {
                                                                "pergunta": "anticoagulantes",
                                                                "operador": "=",
                                                                "valor": "sim"
                                                            }
                                                        },
                                                        {
                                                            "chave": "impacto",
                                                            "tipo": "escala",
                                                            "rotulo": "Quanto o incomoda a queda de cabelo?",
                                                            "ajuda": "",
                                                            "obrigatorio": true,
                                                            "preencher": false,
                                                            "min": 0,
                                                            "max": 10,
                                                            "passo": 1,
                                                            "rotulo_min": "Nada",
                                                            "rotulo_max": "Muito",
                                                            "pontuar": true,
                                                            "alarme_min": null
                                                        }
                                                    ]
                                                }
                                            ]
                                        }
                                    ],
                                    "pontuacao": {
                                        "ativa": true,
                                        "rotulo": "Impacto",
                                        "modo": "soma",
                                        "pergunta": null,
                                        "faixas": [
                                            {
                                                "min": 0,
                                                "max": 4,
                                                "rotulo": "Baixo",
                                                "tom": "sucesso"
                                            },
                                            {
                                                "min": 5,
                                                "max": 10,
                                                "rotulo": "Elevado",
                                                "tom": "aviso"
                                            }
                                        ]
                                    },
                                    "alarmes": {
                                        "departamento": "enfermagem"
                                    }
                                },
                                "nome": "Questionário prévio — FUE",
                                "expira_dias": 14,
                                "ativo": true
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "formulario": {
                                                    "$ref": "#/components/schemas/M1Formulario"
                                                },
                                                "esquema": {
                                                    "$ref": "#/components/schemas/M1EsquemaFormulario"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "formulario": {
                                            "id": 31,
                                            "chave": "questionario_previo_fue",
                                            "nome": "Questionário prévio — FUE",
                                            "descricao": "A preencher antes da primeira consulta.",
                                            "tipo": "questionario_previo",
                                            "tipo_rotulo": "Questionário prévio",
                                            "tecnica": "FUE",
                                            "versao": 4,
                                            "idioma": "pt-PT",
                                            "ativo": true,
                                            "modelo": false,
                                            "expira_dias": 14,
                                            "publicado_em": "2026-10-20T15:40:00+01:00"
                                        },
                                        "esquema": {
                                            "passos": [
                                                {
                                                    "chave": "p1",
                                                    "titulo": "Saúde geral",
                                                    "descricao": "",
                                                    "seccoes": [
                                                        {
                                                            "chave": "s1_1",
                                                            "titulo": "Antecedentes",
                                                            "descricao": "",
                                                            "perguntas": [
                                                                {
                                                                    "chave": "anticoagulantes",
                                                                    "tipo": "simnao",
                                                                    "rotulo": "Toma anticoagulantes?",
                                                                    "ajuda": "",
                                                                    "obrigatorio": true,
                                                                    "preencher": true,
                                                                    "pontos_sim": null,
                                                                    "alarme_sim": true,
                                                                    "alerta": {
                                                                        "tipo": "anticoagulante",
                                                                        "gravidade": "alta",
                                                                        "quando": [
                                                                            "sim"
                                                                        ]
                                                                    }
                                                                },
                                                                {
                                                                    "chave": "qual_anticoagulante",
                                                                    "tipo": "texto",
                                                                    "rotulo": "Qual?",
                                                                    "ajuda": "",
                                                                    "obrigatorio": false,
                                                                    "preencher": true,
                                                                    "max": 200,
                                                                    "condicao": {
                                                                        "pergunta": "anticoagulantes",
                                                                        "operador": "=",
                                                                        "valor": "sim"
                                                                    }
                                                                },
                                                                {
                                                                    "chave": "impacto",
                                                                    "tipo": "escala",
                                                                    "rotulo": "Quanto o incomoda a queda de cabelo?",
                                                                    "ajuda": "",
                                                                    "obrigatorio": true,
                                                                    "preencher": false,
                                                                    "min": 0,
                                                                    "max": 10,
                                                                    "passo": 1,
                                                                    "rotulo_min": "Nada",
                                                                    "rotulo_max": "Muito",
                                                                    "pontuar": true,
                                                                    "alarme_min": null
                                                                }
                                                            ]
                                                        }
                                                    ]
                                                }
                                            ],
                                            "pontuacao": {
                                                "ativa": true,
                                                "rotulo": "Impacto",
                                                "modo": "soma",
                                                "pergunta": null,
                                                "faixas": [
                                                    {
                                                        "min": 0,
                                                        "max": 4,
                                                        "rotulo": "Baixo",
                                                        "tom": "sucesso"
                                                    },
                                                    {
                                                        "min": 5,
                                                        "max": 10,
                                                        "rotulo": "Elevado",
                                                        "tom": "aviso"
                                                    }
                                                ]
                                            },
                                            "alarmes": {
                                                "departamento": "enfermagem"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/formularios/{id}/pedidos": {
            "post": {
                "tags": [
                    "Formulários"
                ],
                "operationId": "m1PedirFormulario",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:editar"
                        ]
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do formulário"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "editar",
                "summary": "Pedido de preenchimento por ligação",
                "description": "A rota não tem permissão própria: o controlador exige «editar» em ficha.identificacao (receção) OU em ficha.clinica — pedir um formulário não mostra conteúdo clínico. Equipa e integrações. Destinatário: paciente_id (que tem de estar no âmbito de identificação, 403) ou lead_id. Só formulários ativos (inexistente ou inativo → 422). Cria o pedido «pendente» com um token de 32 bytes (só o SHA-256 fica guardado) e prazo do formulário ou das definições (1 a 365 dias). Canal email, sms ou whatsapp envia a mensagem de serviço só com o nome do questionário, a ligação e a data limite; «ligacao» e «portal» não enviam mensagem. A ligação devolvida é a página web; o token (último segmento) serve também GET /publico/formularios/{token}. expira_em vem em ISO 8601 (ex.: «2026-11-12T09:40:00+00:00»). Efeitos: linha do tempo (com paciente), auditoria «enviar». Limite (por omissão): 120 pedidos por minuto por token da equipa; nas integrações vale o limite por minuto definido no cliente de integração (429 com Retry-After). Limite adicional: 60 pedidos por 10 minutos por endereço IP (contam só os pedidos que alteram dados).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "paciente_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "lead_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "episodio_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "marco_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "consulta_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "canal": {
                                        "type": "string",
                                        "enum": [
                                            "email",
                                            "sms",
                                            "whatsapp",
                                            "ligacao",
                                            "portal"
                                        ],
                                        "default": "ligacao"
                                    }
                                }
                            },
                            "example": {
                                "paciente_id": 1204,
                                "episodio_id": 77,
                                "canal": "email"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1PedidoFormulario"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "resposta_id": 5130,
                                        "ligacao": "https://clinica.exemplo.pt/formulario/q3V9k1sXw7bE2mN4tR8yU0pL6aZ5cH1dF9gJ3kM2nB4",
                                        "expira_em": "2026-11-12T09:40:00+00:00",
                                        "envio": {
                                            "ok": true,
                                            "estado": "enviada",
                                            "motivo": null,
                                            "mensagem_id": 66102
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/formularios/{id}/preencher": {
            "get": {
                "tags": [
                    "Formulários"
                ],
                "operationId": "m1PreencherFormulario",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Esquema e pré-preenchimento para a equipa",
                "description": "Formulário, esquema atual e valores para pré-preencher: as respostas anteriores (por validar ou validadas) do mesmo formulário — mesma chave, qualquer idioma — do paciente; perguntas com «preencher» desligado, fotografias e assinaturas ficam de fora. Com paciente_id exige que o paciente exista (422) e esteja no âmbito clínico (403). Com episodio_id o episódio tem de ser desse paciente (422 em «episodio_id») e a resposta mais recente desse episódio tem prioridade no pré-preenchimento. Acréscimos compatíveis: «consentimentos» (autorizações que o paciente ainda não deu: a equipa declara-as quando as recolhe presencialmente; sem elas o envio é recusado com 422), «episodio_id» e «episodio». Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do formulário"
                    },
                    {
                        "name": "paciente_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Paciente (para pré-preencher)"
                    },
                    {
                        "name": "episodio_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Episódio do paciente (prioridade no pré-preenchimento)"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "formulario": {
                                                    "$ref": "#/components/schemas/M1Formulario"
                                                },
                                                "esquema": {
                                                    "$ref": "#/components/schemas/M1EsquemaFormulario"
                                                },
                                                "valores": {
                                                    "type": "object",
                                                    "additionalProperties": true,
                                                    "description": "Chave da pergunta → valor."
                                                },
                                                "paciente_id": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                },
                                                "episodio_id": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                },
                                                "episodio": {
                                                    "type": [
                                                        "object",
                                                        "null"
                                                    ],
                                                    "properties": {
                                                        "id": {
                                                            "type": "integer"
                                                        },
                                                        "numero": {
                                                            "type": "string"
                                                        },
                                                        "titulo": {
                                                            "type": "string"
                                                        },
                                                        "estado": {
                                                            "type": "string"
                                                        },
                                                        "estado_rotulo": {
                                                            "type": "string"
                                                        }
                                                    }
                                                },
                                                "consentimentos": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/M1Consentimento"
                                                    }
                                                },
                                                "aviso": {
                                                    "oneOf": [
                                                        {
                                                            "$ref": "#/components/schemas/M1AvisoPrivacidade"
                                                        },
                                                        {
                                                            "type": "null"
                                                        }
                                                    ],
                                                    "description": "Acréscimo compatível: aviso em vigor do canal «formulario» para mostrar ao paciente presente (com paciente_id); devolver o testemunho em «aviso_testemunho»."
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "formulario": {
                                            "id": 31,
                                            "chave": "questionario_previo_fue",
                                            "nome": "Questionário prévio — FUE",
                                            "descricao": "A preencher antes da primeira consulta.",
                                            "tipo": "questionario_previo",
                                            "tipo_rotulo": "Questionário prévio",
                                            "tecnica": "FUE",
                                            "versao": 3,
                                            "idioma": "pt-PT",
                                            "ativo": true,
                                            "modelo": false,
                                            "expira_dias": 14,
                                            "publicado_em": "2026-10-20T15:40:00+01:00"
                                        },
                                        "esquema": {
                                            "passos": [
                                                {
                                                    "chave": "p1",
                                                    "titulo": "Saúde geral",
                                                    "descricao": "",
                                                    "seccoes": [
                                                        {
                                                            "chave": "s1_1",
                                                            "titulo": "Antecedentes",
                                                            "descricao": "",
                                                            "perguntas": [
                                                                {
                                                                    "chave": "anticoagulantes",
                                                                    "tipo": "simnao",
                                                                    "rotulo": "Toma anticoagulantes?",
                                                                    "ajuda": "",
                                                                    "obrigatorio": true,
                                                                    "preencher": true,
                                                                    "pontos_sim": null,
                                                                    "alarme_sim": true,
                                                                    "alerta": {
                                                                        "tipo": "anticoagulante",
                                                                        "gravidade": "alta",
                                                                        "quando": [
                                                                            "sim"
                                                                        ]
                                                                    }
                                                                },
                                                                {
                                                                    "chave": "qual_anticoagulante",
                                                                    "tipo": "texto",
                                                                    "rotulo": "Qual?",
                                                                    "ajuda": "",
                                                                    "obrigatorio": false,
                                                                    "preencher": true,
                                                                    "max": 200,
                                                                    "condicao": {
                                                                        "pergunta": "anticoagulantes",
                                                                        "operador": "=",
                                                                        "valor": "sim"
                                                                    }
                                                                },
                                                                {
                                                                    "chave": "impacto",
                                                                    "tipo": "escala",
                                                                    "rotulo": "Quanto o incomoda a queda de cabelo?",
                                                                    "ajuda": "",
                                                                    "obrigatorio": true,
                                                                    "preencher": false,
                                                                    "min": 0,
                                                                    "max": 10,
                                                                    "passo": 1,
                                                                    "rotulo_min": "Nada",
                                                                    "rotulo_max": "Muito",
                                                                    "pontuar": true,
                                                                    "alarme_min": null
                                                                }
                                                            ]
                                                        }
                                                    ]
                                                }
                                            ],
                                            "pontuacao": {
                                                "ativa": true,
                                                "rotulo": "Impacto",
                                                "modo": "soma",
                                                "pergunta": null,
                                                "faixas": [
                                                    {
                                                        "min": 0,
                                                        "max": 4,
                                                        "rotulo": "Baixo",
                                                        "tom": "sucesso"
                                                    },
                                                    {
                                                        "min": 5,
                                                        "max": 10,
                                                        "rotulo": "Elevado",
                                                        "tom": "aviso"
                                                    }
                                                ]
                                            },
                                            "alarmes": {
                                                "departamento": "enfermagem"
                                            }
                                        },
                                        "valores": {
                                            "anticoagulantes": "sim",
                                            "qual_anticoagulante": "Apixabano 5 mg"
                                        },
                                        "paciente_id": 1204,
                                        "episodio_id": 77,
                                        "episodio": {
                                            "id": 77,
                                            "numero": "E-2026-0077",
                                            "titulo": "FUE — zona frontal",
                                            "estado": "avaliacao",
                                            "estado_rotulo": "Avaliação"
                                        },
                                        "consentimentos": [
                                            {
                                                "finalidade": "tratamento_clinico",
                                                "texto": "O paciente autorizou presencialmente o tratamento dos dados de saúde deste formulário.",
                                                "modelo_id": null
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/formularios/{id}/respostas": {
            "post": {
                "tags": [
                    "Formulários"
                ],
                "operationId": "m1ResponderFormulario",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do formulário"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Gravar uma resposta (equipa ou integração)",
                "description": "Equipa e integrações (os âmbitos clínicos de uma integração só valem com a justificação clínica do cliente aprovada). As respostas são validadas contra o esquema da versão atual: perguntas escondidas pela regra condicional são descartadas, obrigatórias em falta e valores fora do tipo → 422 com a chave da pergunta. Valores: texto e textoLongo (até ao máximo da pergunta), escolha (valor da opção), multipla (lista ou separada por vírgulas), escala (inteiro no intervalo), numero (no intervalo; arredondado às casas), simnao («sim»/«nao»), data, grelha ({linha: coluna}), fotografia (identificadores de ficheiros da clínica do paciente ou sem dono), assinatura (identificador de ficheiro ou PNG em data URL até 2 MB). Gravada pela equipa fica «validado»; por uma integração fica com origem «agente» e «por_validar». Paciente indicado tem de existir (422) e estar no âmbito (403). Efeitos: respostas cifradas, pontuação e faixa, alertas declarados no esquema (por validar quando não é a equipa), alarme → tarefa urgente e aviso ao departamento do esquema, pré-avaliação → tarefa de revisão médica, linha do tempo, auditoria «criar», webhook formulario.respondido (sem respostas). Base legal antes de gravar dados de saúde: com paciente ou lead, o consentimento «tratamento_clinico» (e «fotografias_clinicas» quando há fotografias nas respostas) tem de estar já registado ou ser declarado em «consentimentos» ({finalidade: true}); sem ele nada é gravado e a resposta é 422 com o erro por campo «consentimentos.<finalidade>». As declarações ficam registadas de forma imutável (canal «presencial» pela equipa, «agente_voz» por uma integração). Limite (por omissão): 120 pedidos por minuto por token da equipa; nas integrações vale o limite por minuto definido no cliente de integração (429 com Retry-After).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "respostas": {
                                        "type": "object",
                                        "additionalProperties": true,
                                        "description": "Chave da pergunta → valor."
                                    },
                                    "paciente_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "lead_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "episodio_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "consulta_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "marco_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "idioma": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "enum": [
                                            "pt-PT",
                                            "pt-BR",
                                            "en",
                                            "es",
                                            "fr",
                                            "de",
                                            null
                                        ]
                                    },
                                    "consentimentos": {
                                        "type": "object",
                                        "additionalProperties": {
                                            "type": "boolean"
                                        },
                                        "description": "Consentimentos declarados neste envio: {finalidade: true}."
                                    },
                                    "aviso_testemunho": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "description": "Testemunho do aviso mostrado ao paciente presente (de «aviso» no GET …/preencher); fica registado com o meio «presencial»."
                                    }
                                },
                                "required": [
                                    "respostas"
                                ]
                            },
                            "example": {
                                "respostas": {
                                    "anticoagulantes": "sim",
                                    "qual_anticoagulante": "Apixabano 5 mg",
                                    "impacto": 7
                                },
                                "paciente_id": 1204,
                                "episodio_id": 77,
                                "idioma": "pt-PT",
                                "consentimentos": {
                                    "tratamento_clinico": true
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1ResultadoResposta"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "resposta_id": 5121,
                                        "estado": "validado",
                                        "pontuacao": 7,
                                        "faixa": {
                                            "rotulo": "Elevado",
                                            "tom": "aviso"
                                        },
                                        "alarme": true
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/formularios/{id}/traduzir": {
            "post": {
                "tags": [
                    "Formulários"
                ],
                "operationId": "m1TraduzirFormulario",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do formulário"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Traduzir pelo assistente de IA da clínica",
                "description": "Traduz o nome, a descrição e todos os textos do esquema para o idioma pedido (o esquema não leva dados de pacientes). Cria um formulário com a mesma chave nesse idioma — ou atualiza o que já existe — sempre inativo até alguém o rever e ativar. 422: idioma fora da lista, igual ao do original, uso não configurado ou falha do assistente. Efeitos: cópia da versão, auditoria «criar» com o modelo usado. Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After). Limite adicional: 10 pedidos por 10 minutos por endereço IP (contam só os pedidos que alteram dados).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "idioma": {
                                        "type": "string",
                                        "enum": [
                                            "pt-PT",
                                            "pt-BR",
                                            "en",
                                            "es",
                                            "fr",
                                            "de"
                                        ]
                                    }
                                },
                                "required": [
                                    "idioma"
                                ]
                            },
                            "example": {
                                "idioma": "en"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1Formulario"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 40,
                                        "chave": "questionario_previo_fue",
                                        "nome": "Pre-consultation questionnaire — FUE",
                                        "descricao": "To be completed before the first consultation.",
                                        "tipo": "questionario_previo",
                                        "tipo_rotulo": "Questionário prévio",
                                        "tecnica": "FUE",
                                        "versao": 1,
                                        "idioma": "en",
                                        "ativo": false,
                                        "modelo": false,
                                        "expira_dias": 14,
                                        "publicado_em": "2026-10-20T15:40:00+01:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/galeria/anotacoes/{id}": {
            "put": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "alterarCamadaAnotacoes",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "editar",
                "summary": "Alterar uma camada (nome, elementos, visibilidade, ordem)",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "nome": {
                                        "type": "string"
                                    },
                                    "ordem": {
                                        "type": "integer"
                                    },
                                    "visivel": {
                                        "type": "boolean"
                                    },
                                    "elementos": {
                                        "type": "array",
                                        "items": {
                                            "$ref": "#/components/schemas/ElementoDesenho"
                                        }
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Anotacoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            },
            "delete": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "apagarCamadaAnotacoes",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "editar",
                "summary": "Apagar uma camada (a fotografia não muda)",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Anotacoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/galeria/anterior": {
            "get": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "fotografiaAnterior",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "ver",
                "summary": "Fotografia anterior da mesma vista (sobreposição)",
                "parameters": [
                    {
                        "name": "paciente_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Paciente"
                    },
                    {
                        "name": "vista",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Vista"
                    },
                    {
                        "name": "excluir",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Captura a excluir"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "oneOf": [
                                                {
                                                    "$ref": "#/components/schemas/Foto"
                                                },
                                                {
                                                    "type": "null"
                                                }
                                            ]
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/galeria/captura3d/configuracao": {
            "get": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "configuracaoCaptura3d",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "ver",
                "summary": "Parâmetros da captura 3D e do protocolo com sensores",
                "description": "Distâncias (cm) e velocidades máximas dos avisos, raio da cabeça, grelha da reconstrução, grelha de cobertura (a mesma do servidor), cobertura mínima, tolerâncias do nível e da distância e o protocolo «Modelo 3D — fotografias guiadas».",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/galeria/capturas": {
            "post": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "criarCaptura",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "editar",
                "summary": "Criar captura",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "paciente_id": {
                                        "type": "integer"
                                    },
                                    "tipo": {
                                        "type": "string",
                                        "enum": [
                                            "avaliacao",
                                            "pre_operatorio",
                                            "cirurgia",
                                            "seguimento"
                                        ]
                                    },
                                    "protocolo_id": {
                                        "type": "integer"
                                    },
                                    "marco_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "episodio_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "data": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "notas": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "paciente_id",
                                    "tipo"
                                ]
                            },
                            "example": {
                                "paciente_id": 1204,
                                "tipo": "seguimento",
                                "protocolo_id": 4,
                                "marco_id": 5120
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 812
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/galeria/capturas/{id}/fotos": {
            "post": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "carregarFotoCaptura",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "editar",
                "summary": "Carregar a fotografia de uma vista",
                "description": "Tipo verificado pelo conteúdo, EXIF/GPS removidos, cifrada em repouso. Avaliação de qualidade no servidor (resolução, nitidez por variância do Laplaciano, brilho); qualidade insuficiente marca a captura para repetir.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ficheiro"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary"
                                    },
                                    "vista": {
                                        "type": "string"
                                    },
                                    "zona": {
                                        "type": "string"
                                    },
                                    "etiquetas": {
                                        "type": "string",
                                        "description": "Separadas por vírgulas"
                                    },
                                    "album": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "foto": {
                                                    "$ref": "#/components/schemas/Foto"
                                                },
                                                "qualidade": {
                                                    "$ref": "#/components/schemas/Qualidade"
                                                },
                                                "repetir": {
                                                    "type": "boolean"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "foto": {
                                            "id": 9001,
                                            "vista": "topo"
                                        },
                                        "qualidade": {
                                            "avaliada": true,
                                            "ok": true,
                                            "pontuacao": 86.4
                                        },
                                        "repetir": false
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/galeria/capturas/{id}/repetir": {
            "post": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "repetirCaptura",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "editar",
                "summary": "Pedir a repetição da captura",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": "string",
                                        "maxLength": 255
                                    }
                                },
                                "required": [
                                    "motivo"
                                ]
                            },
                            "example": {
                                "motivo": "Pouca luz na vista do topo"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/galeria/comparar": {
            "get": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "compararFotos",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "ver",
                "summary": "Comparar duas fotografias",
                "parameters": [
                    {
                        "name": "a",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Fotografia A"
                    },
                    {
                        "name": "b",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Fotografia B"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "antes": {
                                                    "$ref": "#/components/schemas/Foto"
                                                },
                                                "depois": {
                                                    "$ref": "#/components/schemas/Foto"
                                                },
                                                "dias": {
                                                    "type": "integer"
                                                },
                                                "texto": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/galeria/fotos/{id}/anotacoes": {
            "get": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "anotacoesFoto",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "ver",
                "summary": "Desenhos sobre a fotografia (camadas vetoriais)",
                "description": "Camadas com elementos traço, seta, texto e medida em frações 0–1 da imagem; a fotografia original nunca muda. Regra de desenho comum à web e à app: referência de 1000 px de largura (espessura × escala; ponta da seta (14 + 3 × espessura) a 28°). As medidas trazem comprimento_px e, com uma medida de referência (referencia_mm), comprimento_mm.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Anotacoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            },
            "post": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "criarCamadaAnotacoes",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "editar",
                "summary": "Criar uma camada de desenhos",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "nome": {
                                        "type": "string",
                                        "maxLength": 80
                                    },
                                    "ordem": {
                                        "type": "integer"
                                    },
                                    "visivel": {
                                        "type": "boolean"
                                    },
                                    "elementos": {
                                        "type": "array",
                                        "items": {
                                            "$ref": "#/components/schemas/ElementoDesenho"
                                        }
                                    }
                                },
                                "required": [
                                    "elementos"
                                ]
                            },
                            "example": {
                                "nome": "Linha frontal proposta",
                                "elementos": [
                                    {
                                        "id": "e1",
                                        "tipo": "traco",
                                        "pontos": [
                                            [
                                                0.3,
                                                0.22
                                            ],
                                            [
                                                0.5,
                                                0.18
                                            ],
                                            [
                                                0.7,
                                                0.22
                                            ]
                                        ],
                                        "cor": "ouro",
                                        "espessura": 3,
                                        "tracejado": true
                                    }
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Anotacoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/galeria/fotos/{id}/desfocar": {
            "post": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "desfocarFoto",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "editar",
                "summary": "Cópia com o rosto desfocado para exportação",
                "description": "Região em frações (0–1) da imagem. A original não muda. Auditoria «exportar».",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "x": {
                                        "type": "number"
                                    },
                                    "y": {
                                        "type": "number"
                                    },
                                    "largura": {
                                        "type": "number"
                                    },
                                    "altura": {
                                        "type": "number"
                                    }
                                },
                                "required": [
                                    "x",
                                    "y",
                                    "largura",
                                    "altura"
                                ]
                            },
                            "example": {
                                "x": 0.3,
                                "y": 0.05,
                                "largura": 0.4,
                                "altura": 0.35
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "foto": {
                                                    "$ref": "#/components/schemas/Foto"
                                                },
                                                "descarregar": {
                                                    "type": "string",
                                                    "format": "uri"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/galeria/fotos/{id}/etiquetas": {
            "post": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "etiquetarFoto",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "editar",
                "summary": "Etiquetas, zona, álbum e vista",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "etiquetas": {
                                        "oneOf": [
                                            {
                                                "type": "array",
                                                "items": {
                                                    "type": "string"
                                                }
                                            },
                                            {
                                                "type": "string"
                                            }
                                        ]
                                    },
                                    "zona": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "album": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "vista": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "etiquetas": [
                                    "linha frontal",
                                    "controlo"
                                ],
                                "album": "Casos 2026"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Foto"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/galeria/fotos/{id}/exportar": {
            "post": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "exportarFotoComunicacao",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "editar",
                "summary": "Exportar para comunicação (rosto desfocado sem o consentimento de imagem)",
                "description": "Sem o consentimento «imagens_comunicacao» válido, a exportação é SEMPRE uma cópia com o rosto desfocado (caixas enviadas, detetadas ou a região típica); com o consentimento, desfocar é opcional. Simulações → 422. A original nunca muda; a exportação fica na auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "finalidade": {
                                        "type": "string",
                                        "enum": [
                                            "comunicacao"
                                        ]
                                    },
                                    "caixas": {
                                        "type": "array",
                                        "items": {
                                            "$ref": "#/components/schemas/Caixa"
                                        }
                                    },
                                    "desfocar": {
                                        "type": "boolean"
                                    }
                                }
                            },
                            "example": {
                                "finalidade": "comunicacao"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "foto": {
                                                    "$ref": "#/components/schemas/Foto"
                                                },
                                                "descarregar": {
                                                    "type": "string",
                                                    "format": "uri"
                                                },
                                                "anonimizada": {
                                                    "type": "boolean"
                                                },
                                                "consentimento": {
                                                    "type": "boolean"
                                                },
                                                "metodo": {
                                                    "type": "string"
                                                },
                                                "caixas": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/Caixa"
                                                    }
                                                },
                                                "aviso": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/galeria/fotos/{id}/partilhar": {
            "post": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "partilharFoto",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "editar",
                "summary": "Partilha seletiva com o paciente",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "partilhar": {
                                        "type": "boolean"
                                    }
                                },
                                "required": [
                                    "partilhar"
                                ]
                            },
                            "example": {
                                "partilhar": true
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Foto"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/galeria/fotos/{id}/rostos": {
            "post": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "rostosFoto",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "editar",
                "summary": "Localizar o rosto (caixas)",
                "description": "Deteção pela IA de visão (só com o consentimento «ia» do paciente; Ollama primeiro, serviço externo só com o interruptor dos dados de pacientes). Sem deteção possível, devolve a região típica da vista (metodo «omissao»). Vistas sem rosto: metodo «nenhum».",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "caixas": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/Caixa"
                                                    }
                                                },
                                                "metodo": {
                                                    "type": "string",
                                                    "enum": [
                                                        "ia",
                                                        "omissao",
                                                        "nenhum"
                                                    ]
                                                },
                                                "analise_id": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                },
                                                "aviso": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "caixas": [
                                            {
                                                "x": 0.31,
                                                "y": 0.42,
                                                "largura": 0.38,
                                                "altura": 0.46
                                            }
                                        ],
                                        "metodo": "ia",
                                        "analise_id": 812,
                                        "aviso": null
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/galeria/fotos/{id}/verificar": {
            "post": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "verificarFoto",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "editar",
                "summary": "Aceitar ou rejeitar uma fotografia do paciente",
                "description": "Rejeitar exige resposta (guardada cifrada). O paciente recebe uma notificação sem pormenores clínicos.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "decisao": {
                                        "type": "string",
                                        "enum": [
                                            "aceite",
                                            "rejeitada"
                                        ]
                                    },
                                    "resposta": {
                                        "type": "string",
                                        "maxLength": 1000
                                    }
                                },
                                "required": [
                                    "decisao"
                                ]
                            },
                            "example": {
                                "decisao": "rejeitada",
                                "resposta": "Repita com luz natural, sem flash."
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Foto"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/galeria/modelos3d": {
            "post": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "carregarModelo3d",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "summary": "Carregar modelo 3D",
                "description": "GLB, glTF, OBJ, PLY, STL ou USDZ, validados pelo conteúdo; guardado cifrado. O servidor lê a malha (vértices, triângulos, área, unidade) e mede a cobertura do couro cabeludo; a captura da app envia origem lidar/profundidade, o aparelho e captura_meta (duração, amostras, avisos de distância/velocidade/rastreio, % de tempo com aviso, mapa de cobertura em hexadecimal). Resposta com «aviso» quando a malha não se consegue ler.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ficheiro",
                                    "paciente_id"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary"
                                    },
                                    "paciente_id": {
                                        "type": "integer"
                                    },
                                    "captura_id": {
                                        "type": "integer"
                                    },
                                    "cobertura_pct": {
                                        "type": "number"
                                    },
                                    "escala_confirmada": {
                                        "type": "boolean"
                                    },
                                    "qualidade": {
                                        "type": "string",
                                        "enum": [
                                            "boa",
                                            "aceitavel",
                                            "insuficiente"
                                        ]
                                    },
                                    "origem": {
                                        "type": "string",
                                        "enum": [
                                            "carregado",
                                            "lidar",
                                            "profundidade"
                                        ]
                                    },
                                    "aparelho": {
                                        "type": "string"
                                    },
                                    "escala_metodo": {
                                        "type": "string",
                                        "enum": [
                                            "sensor",
                                            "marcador",
                                            "regua",
                                            "manual"
                                        ]
                                    },
                                    "unidade_modelo": {
                                        "type": "string",
                                        "enum": [
                                            "m",
                                            "cm",
                                            "mm"
                                        ]
                                    },
                                    "captura_meta": {
                                        "type": "string",
                                        "description": "JSON"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Modelo3d"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/galeria/modelos3d/partilhas/{id}/revogar": {
            "post": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "revogarPartilhaModelo3d",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "summary": "Revogar uma ligação de pré-visualização",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/galeria/modelos3d/{id}": {
            "get": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "obterModelo3d",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "ver",
                "summary": "Modelo 3D com tudo o que o visualizador precisa",
                "description": "Ligação assinada ao ficheiro, malha (vértices, triângulos, área), referencial da cabeça, cobertura e a sua origem, escala (método, fator, referência), captura, marcações com triângulos, pontos de tricoscopia no modelo, linha frontal, cabelo simulado, outros modelos do paciente, planos (densidades), ligações de pré-visualização e permissões.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Modelo3d"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            },
            "put": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "atualizarModelo3d",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "summary": "Pontos anatómicos, cobertura, escala, qualidade e áreas",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "referencias": {
                                        "type": "object"
                                    },
                                    "cobertura_pct": {
                                        "type": "number"
                                    },
                                    "escala_confirmada": {
                                        "type": "boolean"
                                    },
                                    "qualidade": {
                                        "type": "string"
                                    },
                                    "zonas": {
                                        "type": "object",
                                        "additionalProperties": {
                                            "type": "number"
                                        },
                                        "x-unidade": "cm²"
                                    },
                                    "area_dadora_cm2": {
                                        "type": "number",
                                        "x-unidade": "cm²"
                                    },
                                    "partilhado_paciente": {
                                        "type": "boolean"
                                    },
                                    "notas": {
                                        "type": "string"
                                    },
                                    "espessura_cabelo_mm": {
                                        "type": "number",
                                        "x-unidade": "mm"
                                    },
                                    "unidade_modelo": {
                                        "type": "string",
                                        "enum": [
                                            "m",
                                            "cm",
                                            "mm"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "escala_confirmada": true,
                                "cobertura_pct": 94.5,
                                "zonas": {
                                    "linha_frontal": 15.2,
                                    "coroa": 68.9
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Modelo3d"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/galeria/modelos3d/{id}/diferencas": {
            "get": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "diferencasModelo3d",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "ver",
                "summary": "Mapa de diferenças face a outro modelo do paciente",
                "description": "Alinhamento pelos pontos anatómicos comuns (≥ 3; método de Horn) e afinação pelo ponto mais próximo. distancias_b64: inteiros de 16 bits little-endian, um por vértice pela ordem canónica, em décimas de mm (−32768 = sem correspondência). Com média, percentil 95 e máximo (mm).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "name": "com",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Outro modelo do mesmo paciente"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/galeria/modelos3d/{id}/escala": {
            "post": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "escalaModelo3d",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "summary": "Confirmar a escala pela referência (autocolante ou régua)",
                "description": "Dois pontos da malha (unidades do modelo) e o comprimento real em mm. Grava o fator (cm por unidade), confirma a escala, devolve a diferença face à escala anterior e mede de novo todas as zonas.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "a": {
                                        "type": "object"
                                    },
                                    "b": {
                                        "type": "object"
                                    },
                                    "comprimento_mm": {
                                        "type": "number",
                                        "x-unidade": "mm"
                                    },
                                    "metodo": {
                                        "type": "string",
                                        "enum": [
                                            "marcador",
                                            "regua"
                                        ]
                                    }
                                },
                                "required": [
                                    "a",
                                    "b",
                                    "comprimento_mm"
                                ]
                            },
                            "example": {
                                "a": {
                                    "x": 0.031,
                                    "y": 0.072,
                                    "z": 0.061
                                },
                                "b": {
                                    "x": 0.05,
                                    "y": 0.071,
                                    "z": 0.058
                                },
                                "comprimento_mm": 20,
                                "metodo": "marcador"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/galeria/modelos3d/{id}/linha-frontal": {
            "post": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "linhaFrontalModelo3d",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "summary": "Linha frontal em 3D (com simetria)",
                "description": "Pontos [[x,y,z]…] pela ordem (2 a 300). Devolve comprimento (cm), altura acima da glabela (cm), assimetria média (mm) e a projeção no diagrama 2D. Lista vazia apaga.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "pontos": {
                                        "type": "array",
                                        "items": {
                                            "type": "array",
                                            "items": {
                                                "type": "number"
                                            }
                                        }
                                    },
                                    "simetria": {
                                        "type": "boolean"
                                    }
                                },
                                "required": [
                                    "pontos"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/galeria/modelos3d/{id}/partilhas": {
            "get": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "partilhasModelo3d",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "summary": "Ligações de pré-visualização ativas",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            },
            "post": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "partilharModelo3d",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "summary": "Criar ligação temporária para ver o modelo noutro aparelho",
                "description": "Devolve o url /m3d/<código> (página pública só com o modelo, sem dados pessoais; malha limpa, por omissão sem o rosto). Só o sha256 do código fica guardado. Validade de 5 a 240 minutos.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "minutos": {
                                        "type": "integer"
                                    },
                                    "sem_rosto": {
                                        "type": "boolean"
                                    }
                                }
                            },
                            "example": {
                                "minutos": 30,
                                "sem_rosto": true
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/galeria/modelos3d/{id}/ponto-diagrama": {
            "post": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "pontoDiagramaModelo3d",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "ver",
                "summary": "Posição de um ponto da malha no diagrama 2D",
                "description": "Projeção azimutal a partir do vértice no referencial da cabeça (pontos anatómicos, captura da app ou estimado). Devolve x, y (0–1), a subzona sugerida (a zona marcada que contém o triângulo, quando existe) e a fonte do referencial. Para gravar um campo de tricoscopia com o ponto no modelo, envie ponto.modelo3d = {id, x, y, z} em POST /tricoscopia.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "x": {
                                        "type": "number"
                                    },
                                    "y": {
                                        "type": "number"
                                    },
                                    "z": {
                                        "type": "number"
                                    },
                                    "triangulo": {
                                        "type": "integer"
                                    }
                                },
                                "required": [
                                    "x",
                                    "y",
                                    "z"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/galeria/modelos3d/{id}/simulacao": {
            "post": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "cabeloSimuladoModelo3d",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "summary": "Parâmetros do cabelo simulado por zona",
                "description": "Por zona marcada: densidade_cabelos_cm2, angulo (°), direcao (frente, tras, esquerda, direita, radial), calibre_mm, ondulacao (0–1), cor (#rrggbb) e comprimento_mm. Ilustrativo: não altera números do plano; o aviso da simulação acompanha sempre a visualização.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "zonas": {
                                        "type": "object"
                                    },
                                    "plano_id": {
                                        "type": "integer"
                                    }
                                },
                                "required": [
                                    "zonas"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/galeria/modelos3d/{id}/zonas/{zona}": {
            "put": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "marcarZonaModelo3d",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "summary": "Marcar uma zona na malha (área medida no servidor)",
                "description": "triangulos em intervalos «a-b,c,…» pela ordem canónica da malha. Cada triângulo pertence a uma só zona (sai das outras). Devolve todas as marcações com área na pele e na superfície (cm²), perímetro (cm) e erro de contorno (%), e o modelo com zonas/dadoras/zonas_erro atualizados. Lista vazia apaga a marcação.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "name": "zona",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "linha_frontal",
                                "tufo_central",
                                "frontal",
                                "tempora_esq",
                                "tempora_dir",
                                "media",
                                "coroa",
                                "sobrancelha",
                                "outra",
                                "occipital",
                                "parietal_esq",
                                "parietal_dir"
                            ]
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "triangulos": {
                                        "type": "string"
                                    },
                                    "ferramenta": {
                                        "type": "string",
                                        "enum": [
                                            "pincel",
                                            "laco",
                                            "retangulo",
                                            "misto"
                                        ]
                                    },
                                    "espessura_cabelo_mm": {
                                        "type": "number",
                                        "x-unidade": "mm"
                                    }
                                },
                                "required": [
                                    "triangulos"
                                ]
                            },
                            "example": {
                                "triangulos": "120-388,402,410-415",
                                "ferramenta": "pincel",
                                "espessura_cabelo_mm": 2
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            },
            "delete": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "apagarZonaModelo3d",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "summary": "Apagar a marcação de uma zona",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "name": "zona",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/galeria/pacientes/{paciente_id}": {
            "get": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "galeriaPaciente",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "ver",
                "summary": "Galeria de um paciente",
                "description": "Capturas com as casas do protocolo (fotografia por vista e vistas em falta), fotografias filtradas, modelos 3D, protocolos, marcos, etiquetas, álbuns e contagem por verificar. Ligações assinadas de 15 minutos. Auditado.",
                "parameters": [
                    {
                        "name": "paciente_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "name": "f[marco]",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Marco"
                    },
                    {
                        "name": "f[vista]",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Vista"
                    },
                    {
                        "name": "f[zona]",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Zona"
                    },
                    {
                        "name": "f[etiqueta]",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Etiqueta"
                    },
                    {
                        "name": "f[album]",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Álbum"
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "por_verificar",
                                "aceite",
                                "rejeitada"
                            ]
                        },
                        "description": "Estado"
                    },
                    {
                        "name": "f[simulacao]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "0",
                                "1"
                            ]
                        },
                        "description": "Simulações"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/galeria/por-verificar": {
            "get": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "fotosPorVerificar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "ver",
                "summary": "Fotografias enviadas pelos pacientes por verificar",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Foto"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/galeria/protocolos": {
            "get": {
                "tags": [
                    "Galeria clínica"
                ],
                "operationId": "protocolosFotograficos",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "ver",
                "summary": "Protocolos fotográficos ativos",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Protocolo"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/ganchos/anular/{codigo}": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "post": {
                "tags": [
                    "Chat do site e subscrições"
                ],
                "operationId": "anularUmClique",
                "security": [],
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "publico",
                "summary": "Anular a subscrição com um clique (List-Unsubscribe-Post)",
                "description": "Usado pelos clientes de email (RFC 8058). A clínica vem do registo do envio a que o código pertence. Efeitos: contacto na lista de oposição de email, consentimento de marketing revogado, contagem de anulações.",
                "parameters": [
                    {
                        "name": "codigo",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^[A-Za-z0-9_-]{16,128}$"
                        },
                        "description": "Código do envio"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/x-www-form-urlencoded": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "List-Unsubscribe": {
                                        "const": "One-Click"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Anulado (ou código desconhecido — a resposta é igual)"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/ganchos/faturacao": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "post": {
                "tags": [
                    "Avisos de fornecedores (comercial)"
                ],
                "operationId": "m5GanchoFaturacao",
                "security": [],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "publico",
                "summary": "Estado de documento do programa de faturação",
                "description": "Atualiza um documento «pedido» com o número, ATCUD e estado final. O segredo (X-AX-Segredo) é comparado com faturacao.gancho_segredo da clínica dona do documento.",
                "parameters": [
                    {
                        "name": "X-AX-Segredo",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Segredo da clínica"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "externo_id": {
                                        "type": "string"
                                    },
                                    "estado": {
                                        "type": "string",
                                        "enum": [
                                            "emitido",
                                            "erro",
                                            "anulado"
                                        ]
                                    },
                                    "numero": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "atcud": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "erro": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "externo_id",
                                    "estado"
                                ]
                            },
                            "example": {
                                "externo_id": "84512233",
                                "estado": "emitido",
                                "numero": "FR A2026/118",
                                "atcud": "JJ3KX9QW-118"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Tratado",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "type": "boolean"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Segredo inválido"
                    },
                    "404": {
                        "description": "Documento desconhecido"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/ganchos/leads/google": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "post": {
                "tags": [
                    "Avisos de fornecedores (CRM)"
                ],
                "operationId": "ganchoLeadsGoogle",
                "security": [],
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "publico",
                "summary": "Formulários de leads da Google",
                "description": "Formato da Google (lead_id, user_column_data, form_id, campaign_id, gcl_id, is_test, google_key). A «google_key» identifica a clínica (crm.google.chave_leads, comparada em tempo constante; 401 se não coincidir). O lead entra pela fila (idempotente pelo lead_id) e é criado pelo funil; os envios de teste só confirmam a ligação. Corpo ≤ 256 KB. Limite: 300/min por IP.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object"
                            },
                            "example": {
                                "lead_id": "TeSter-123-ABCDEFGHIJKLMNOPQRSTUVWXYZ",
                                "user_column_data": [
                                    {
                                        "column_id": "FULL_NAME",
                                        "string_value": "Ana Costa"
                                    },
                                    {
                                        "column_id": "EMAIL",
                                        "string_value": "ana@exemplo.pt"
                                    },
                                    {
                                        "column_id": "PHONE_NUMBER",
                                        "string_value": "+351912345678"
                                    }
                                ],
                                "form_id": 123456,
                                "campaign_id": 987654,
                                "gcl_id": "EAIaIQobChMI…",
                                "is_test": true,
                                "google_key": "••••"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Recebido"
                    },
                    "400": {
                        "description": "Corpo inválido"
                    },
                    "401": {
                        "description": "Chave desconhecida"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/ganchos/pagamentos": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "get": {
                "tags": [
                    "Avisos de fornecedores (comercial)"
                ],
                "operationId": "m5GanchoPagamentos",
                "security": [],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "publico",
                "summary": "Aviso de pagamento (Ifthenpay)",
                "description": "Endereço a configurar no fornecedor: /ganchos/pagamentos?key=[ANTI_PHISHING_KEY]&referencia=[REFERENCE]&valor=[AMOUNT]&pedido=[ORDER_ID]&id_pedido=[REQUEST_ID]&metodo=[PAYMENT_METHOD]. A clínica é resolvida pelo registo do pagamento (referência Multibanco, identificador do pedido MB WAY ou da ligação) e a chave anti-phishing é comparada com a dessa clínica. O valor tem de coincidir; o estado é confirmado junto do fornecedor quando possível. Cada aviso fica registado (sem dados pessoais). Responde em texto.",
                "parameters": [
                    {
                        "name": "key",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Chave anti-phishing da clínica"
                    },
                    {
                        "name": "referencia",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Referência Multibanco"
                    },
                    {
                        "name": "pedido",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Identificador do pedido"
                    },
                    {
                        "name": "id_pedido",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Identificador do pedido MB WAY"
                    },
                    {
                        "name": "valor",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Valor"
                    },
                    {
                        "name": "metodo",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Método"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Tratado (texto «OK»)",
                        "content": {
                            "text/plain": {
                                "schema": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Pedido inválido"
                    },
                    "403": {
                        "description": "Chave inválida"
                    },
                    "404": {
                        "description": "Pagamento desconhecido"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/ganchos/telefonia": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "post": {
                "tags": [
                    "Avisos de fornecedores (CRM)"
                ],
                "operationId": "ganchoTelefonia",
                "security": [],
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "publico",
                "summary": "Eventos da central telefónica",
                "description": "Um evento ou {\"eventos\": […]}. A clínica é a dona do segredo (X-AX-Segredo) ou da assinatura (X-AX-Assinatura: sha256=HMAC do corpo); se o número de destino estiver nos números de uma clínica, só essa é testada. Efeitos: chamada registada e ligada ao paciente/lead pelo número (lead novo com origem telefone se desconhecido), chamada perdida → tarefa «devolver» com tempo-alvo, chamada de saída para um número com chamada perdida marca-a como devolvida, gravação guardada só com consentimento (https ou base64) e analisada (resumo e pontuação do guião), SMS recebido → caixa de entrada. Transcrição: se o evento traz «transcricao», é essa que fica; uma gravação consentida ou um correio de voz sem transcrição fica pendente e é transcrito pela IA da clínica nos minutos seguintes (agendador crm.transcricoes; serviço local primeiro, externo só com o interruptor dos dados de pacientes).",
                "parameters": [
                    {
                        "name": "X-AX-Segredo",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Segredo da clínica (ou use a assinatura)."
                    },
                    {
                        "name": "X-AX-Assinatura",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "sha256=<HMAC-SHA256 do corpo com o segredo>"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "evento": {
                                        "type": "string",
                                        "enum": [
                                            "a_tocar",
                                            "atendida",
                                            "terminada",
                                            "perdida",
                                            "correio_voz",
                                            "ocupado",
                                            "sms"
                                        ]
                                    },
                                    "chamada_id": {
                                        "type": "string"
                                    },
                                    "de": {
                                        "type": "string"
                                    },
                                    "para": {
                                        "type": "string"
                                    },
                                    "direcao": {
                                        "type": "string",
                                        "enum": [
                                            "entrada",
                                            "saida"
                                        ]
                                    },
                                    "inicio": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "duracao_s": {
                                        "type": "integer",
                                        "x-unidade": "s"
                                    },
                                    "utilizador_email": {
                                        "type": "string",
                                        "format": "email"
                                    },
                                    "gravacao_consentida": {
                                        "type": "boolean"
                                    },
                                    "gravacao_url": {
                                        "type": "string",
                                        "format": "uri"
                                    },
                                    "gravacao_base64": {
                                        "type": "string"
                                    },
                                    "transcricao": {
                                        "type": "string"
                                    },
                                    "texto": {
                                        "type": "string",
                                        "description": "Texto do SMS (evento sms)."
                                    },
                                    "mensagem_id": {
                                        "type": "string"
                                    },
                                    "extensao": {
                                        "type": "string",
                                        "description": "Extensão onde a chamada toca (evento a_tocar): a pessoa dessa extensão recebe o aviso com a ficha do contacto e a chamada aparece na central no ecrã."
                                    }
                                },
                                "required": [
                                    "evento"
                                ]
                            },
                            "example": {
                                "evento": "perdida",
                                "chamada_id": "pbx-55a1c",
                                "de": "+351912345678",
                                "para": "+351210000000",
                                "direcao": "entrada",
                                "inicio": "2026-10-28T13:05:00+00:00",
                                "duracao_s": 0
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Recebido",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "type": "boolean"
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "chamadas": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "integer"
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "chamadas": [
                                            30552
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Corpo inválido"
                    },
                    "401": {
                        "description": "Segredo ou assinatura inválidos"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/ganchos/terminais/stripe": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "post": {
                "tags": [
                    "Avisos de fornecedores (comercial)"
                ],
                "operationId": "m5GanchoTerminalStripe",
                "security": [],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "publico",
                "summary": "Aviso Stripe Terminal (assinado)",
                "description": "Eventos payment_intent.succeeded, payment_intent.payment_failed, payment_intent.canceled, terminal.reader.action_succeeded e terminal.reader.action_failed. Cabeçalho Stripe-Signature (HMAC-SHA256 de «t.corpo» com terminais.stripe.segredo_gancho da clínica dona da cobrança, tolerância de 5 minutos). Confirmação pela API (payment_intent «succeeded» e amount_received certo) antes de marcar pago.",
                "parameters": [
                    {
                        "name": "Stripe-Signature",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Assinatura da Stripe"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "id": {
                                        "type": "string"
                                    },
                                    "type": {
                                        "type": "string"
                                    },
                                    "data": {
                                        "type": "object"
                                    }
                                },
                                "required": [
                                    "type",
                                    "data"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Tratado",
                        "content": {
                            "text/plain": {
                                "schema": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Assinatura inválida"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/ganchos/terminais/sumup/{token}": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "post": {
                "tags": [
                    "Avisos de fornecedores (comercial)"
                ],
                "operationId": "m5GanchoTerminalSumup",
                "security": [],
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "publico",
                "summary": "Aviso de cobrança SumUp (Solo)",
                "description": "return_url de cada cobrança (evento solo.transaction.updated). A SumUp não assina o aviso: o token de 48 hexadecimais, único por cobrança (só o SHA-256 fica guardado), faz de segredo. O pagamento só fica pago depois de confirmado pela API da SumUp, com o valor certo.",
                "parameters": [
                    {
                        "name": "token",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^[a-f0-9]{48}$"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "id": {
                                        "type": "string"
                                    },
                                    "event_type": {
                                        "type": "string"
                                    },
                                    "payload": {
                                        "type": "object",
                                        "properties": {
                                            "client_transaction_id": {
                                                "type": "string"
                                            },
                                            "merchant_code": {
                                                "type": "string"
                                            },
                                            "status": {
                                                "type": "string",
                                                "enum": [
                                                    "successful",
                                                    "failed"
                                                ]
                                            }
                                        }
                                    },
                                    "timestamp": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "event_type",
                                    "payload"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Tratado",
                        "content": {
                            "text/plain": {
                                "schema": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Token ou transação inválidos"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/ganchos/voz": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "post": {
                "tags": [
                    "Avisos de fornecedores (CRM)"
                ],
                "operationId": "ganchoAgenteVoz",
                "security": [],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "publico",
                "summary": "Eventos do agente de voz",
                "description": "Um evento ou {\"eventos\": […]} do fornecedor do agente, agrupados por conversa_id. Autenticação e clínica pelo segredo do agente da clínica (X-AX-Segredo ou X-AX-Assinatura). Eventos: inicio, transcricao, resumo, intencao, alarme, idioma, marcacao, fim. Efeitos: pedido do agente, lead quando o contacto é desconhecido, marcação pedida para a receção, sinal de alarme (por palavra da clínica ou indicado pelo fornecedor) → passa de imediato à enfermagem com tarefa urgente, passar_equipa → equipa avisada, consumo contabilizado.",
                "parameters": [
                    {
                        "name": "X-AX-Segredo",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Segredo do agente da clínica."
                    },
                    {
                        "name": "X-AX-Assinatura",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "sha256=<HMAC-SHA256 do corpo>"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "evento": {
                                        "type": "string",
                                        "enum": [
                                            "inicio",
                                            "transcricao",
                                            "resumo",
                                            "intencao",
                                            "alarme",
                                            "idioma",
                                            "marcacao",
                                            "fim"
                                        ]
                                    },
                                    "conversa_id": {
                                        "type": "string"
                                    },
                                    "canal": {
                                        "type": "string",
                                        "enum": [
                                            "voz",
                                            "whatsapp",
                                            "chat"
                                        ]
                                    },
                                    "telefone": {
                                        "type": "string"
                                    },
                                    "nome": {
                                        "type": "string"
                                    },
                                    "data_nascimento": {
                                        "type": "string",
                                        "format": "date"
                                    },
                                    "tipo": {
                                        "type": "string",
                                        "enum": [
                                            "marcacao",
                                            "informacao",
                                            "pos_operatorio",
                                            "pagamento",
                                            "alarme",
                                            "outro"
                                        ]
                                    },
                                    "intencao": {
                                        "type": "string"
                                    },
                                    "proximo_passo": {
                                        "type": "string"
                                    },
                                    "resumo": {
                                        "type": "string"
                                    },
                                    "transcricao": {
                                        "type": "string"
                                    },
                                    "notas": {
                                        "type": "string",
                                        "description": "Notas referidas pelo paciente (ficam por validar)."
                                    },
                                    "idioma": {
                                        "type": "string"
                                    },
                                    "aviso_ia": {
                                        "type": "boolean"
                                    },
                                    "identificacao_verificada": {
                                        "type": "boolean"
                                    },
                                    "sinal_alarme": {
                                        "type": "boolean"
                                    },
                                    "sinais": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        }
                                    },
                                    "marcacao": {
                                        "type": "object",
                                        "properties": {
                                            "preferencia": {
                                                "type": "string"
                                            },
                                            "inicio": {
                                                "type": "string",
                                                "format": "date-time"
                                            },
                                            "tipo_marcacao_id": {
                                                "type": "integer"
                                            }
                                        }
                                    },
                                    "passar_equipa": {
                                        "type": "boolean"
                                    },
                                    "motivo": {
                                        "type": "string"
                                    },
                                    "inicio": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "fim": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "duracao_s": {
                                        "type": "integer",
                                        "x-unidade": "s"
                                    },
                                    "gravacao_consentida": {
                                        "type": "boolean"
                                    },
                                    "gravacao": {
                                        "type": "string",
                                        "description": "Endereço https ou conteúdo em base64."
                                    }
                                },
                                "required": [
                                    "evento",
                                    "conversa_id"
                                ]
                            },
                            "example": {
                                "evento": "fim",
                                "conversa_id": "va-20261027-2114-77",
                                "canal": "voz",
                                "telefone": "+351936000111",
                                "nome": "Helena Duarte",
                                "tipo": "marcacao",
                                "intencao": "Remarcar consulta de revisão",
                                "resumo": "Pede para mudar a consulta de quinta para a semana seguinte.",
                                "aviso_ia": true,
                                "identificacao_verificada": true,
                                "duracao_s": 143,
                                "passar_equipa": true,
                                "motivo": "Remarcação precisa de confirmação da receção"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Recebido",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "type": "boolean"
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "pedidos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "integer"
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "pedidos": [
                                            77
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Corpo inválido"
                    },
                    "401": {
                        "description": "Segredo ou assinatura inválidos"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/ganchos/voz/audio/{token}": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "get": {
                "tags": [
                    "Avisos de fornecedores (CRM)"
                ],
                "operationId": "vozAudio",
                "security": [],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "publico",
                "summary": "Motor de voz próprio — áudio de uma resposta",
                "description": "O áudio de uma resposta pedido com audio_modo = ligacao. Ligação assinada, válida 120 s e de uso único (404 depois de lida ou expirada).",
                "parameters": [
                    {
                        "name": "token",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^[a-f0-9]{48}\\.[0-9]{10}\\.[a-f0-9]{64}$"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Áudio",
                        "content": {
                            "audio/wav": {
                                "schema": {
                                    "type": "string",
                                    "format": "binary"
                                }
                            },
                            "audio/mpeg": {
                                "schema": {
                                    "type": "string",
                                    "format": "binary"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ligação inválida, expirada ou já usada"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/ganchos/voz/conhecimento": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "get": {
                "tags": [
                    "Avisos de fornecedores (CRM)"
                ],
                "operationId": "ganchoAgenteConhecimento",
                "security": [],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "publico",
                "summary": "Base de conhecimento aprovada para o agente",
                "description": "Só conteúdos aprovados para o agente, aviso de IA obrigatório, sinais de alarme, temas proibidos, aviso de gravação e horário. Autenticação pelo segredo do agente da clínica (X-AX-Segredo).",
                "parameters": [
                    {
                        "name": "X-AX-Segredo",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Segredo do agente da clínica."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "type": "boolean"
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "aviso_ia": {
                                                    "type": "string"
                                                },
                                                "alarmes": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "temas_proibidos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "aviso_gravacao": {
                                                    "type": "string"
                                                },
                                                "horario": {
                                                    "type": "object",
                                                    "properties": {
                                                        "dias": {
                                                            "type": "array",
                                                            "items": {
                                                                "type": "string"
                                                            }
                                                        },
                                                        "inicio": {
                                                            "type": "string"
                                                        },
                                                        "fim": {
                                                            "type": "string"
                                                        },
                                                        "agente": {
                                                            "type": "string",
                                                            "enum": [
                                                                "fora_horas",
                                                                "continuo",
                                                                "desligado"
                                                            ]
                                                        }
                                                    }
                                                },
                                                "artigos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "integer"
                                                            },
                                                            "titulo": {
                                                                "type": "string"
                                                            },
                                                            "corpo": {
                                                                "type": "string"
                                                            },
                                                            "categoria": {
                                                                "type": "string"
                                                            },
                                                            "idioma": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "versao": {
                                                                "type": "integer"
                                                            },
                                                            "clinico": {
                                                                "type": "boolean"
                                                            },
                                                            "aprovado_em": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ],
                                                                "format": "date-time"
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "aviso_ia": "Olá! Sou o assistente virtual da clínica (inteligência artificial)…",
                                        "alarmes": [
                                            "febre",
                                            "sangramento"
                                        ],
                                        "temas_proibidos": [
                                            "diagnóstico"
                                        ],
                                        "aviso_gravacao": "Esta chamada pode ser gravada…",
                                        "horario": {
                                            "dias": [
                                                "1",
                                                "2",
                                                "3",
                                                "4",
                                                "5"
                                            ],
                                            "inicio": "09:00",
                                            "fim": "19:00",
                                            "agente": "fora_horas"
                                        },
                                        "artigos": [
                                            {
                                                "id": 3,
                                                "titulo": "Horário",
                                                "corpo": "Segunda a sexta, das 9h às 19h.",
                                                "categoria": "horario",
                                                "idioma": "pt-PT",
                                                "versao": 1,
                                                "clinico": false,
                                                "aprovado_em": "2026-10-20T10:00:00+00:00"
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Segredo inválido"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/ganchos/voz/fim": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "post": {
                "tags": [
                    "Avisos de fornecedores (CRM)"
                ],
                "operationId": "vozFim",
                "security": [],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "publico",
                "summary": "Motor de voz próprio — fim da chamada",
                "description": "Fecha a chamada (se ainda estiver ativa), regista a duração no consumo do mês e guarda a gravação completa SÓ com consentimento (gravacao_base64 ou gravacao_url https), apagada ao fim de crm.telefonia.gravacoes_dias. Pode ser chamado depois de «transferir» ou «terminar» (só atualiza a duração e a gravação). Funciona mesmo que a clínica tenha entretanto mudado de motor.",
                "parameters": [
                    {
                        "name": "X-AX-Segredo",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Segredo do agente da clínica."
                    },
                    {
                        "name": "X-AX-Assinatura",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "sha256=<HMAC-SHA256 do corpo>"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "chamada_id": {
                                        "type": "string"
                                    },
                                    "duracao_s": {
                                        "type": "integer",
                                        "minimum": 0,
                                        "x-unidade": "s"
                                    },
                                    "motivo": {
                                        "type": "string",
                                        "enum": [
                                            "desligou",
                                            "transferida",
                                            "erro",
                                            "outro"
                                        ]
                                    },
                                    "gravacao_consentida": {
                                        "type": "boolean"
                                    },
                                    "gravacao_base64": {
                                        "type": "string"
                                    },
                                    "gravacao_url": {
                                        "type": "string",
                                        "format": "uri"
                                    },
                                    "correio_voz_base64": {
                                        "type": "string",
                                        "description": "Mensagem deixada no correio de voz do menu (WAV/MP3, ≤ 20 MB): cria a tarefa «Devolver a chamada» com a transcrição."
                                    },
                                    "correio_voz_url": {
                                        "type": "string",
                                        "format": "uri",
                                        "description": "Alternativa a correio_voz_base64 (só https)."
                                    }
                                },
                                "required": [
                                    "chamada_id"
                                ]
                            },
                            "example": {
                                "chamada_id": "pbx-7f3a-20261029-2214",
                                "duracao_s": 154,
                                "motivo": "desligou",
                                "gravacao_consentida": false
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Fechada",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "type": "boolean"
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "sessao": {
                                                    "type": "string"
                                                },
                                                "pedido_id": {
                                                    "type": "integer"
                                                },
                                                "estado": {
                                                    "type": "string",
                                                    "enum": [
                                                        "ativa",
                                                        "transferida",
                                                        "terminada"
                                                    ]
                                                },
                                                "turnos": {
                                                    "type": "integer"
                                                },
                                                "duracao_s": {
                                                    "type": "integer"
                                                },
                                                "gravacao_guardada": {
                                                    "type": "boolean"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "sessao": "pbx-7f3a-20261029-2214",
                                        "pedido_id": 912,
                                        "estado": "terminada",
                                        "turnos": 4,
                                        "duracao_s": 154,
                                        "gravacao_guardada": false
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Segredo ou assinatura inválidos"
                    },
                    "404": {
                        "description": "Chamada desconhecida"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/ganchos/voz/saida": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "post": {
                "tags": [
                    "Avisos de fornecedores (CRM)"
                ],
                "operationId": "vozSaida",
                "security": [],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "publico",
                "summary": "Agente de saída — chamadas a fazer agora",
                "description": "A ponte pede as chamadas que o agente deve fazer (listas do marcador com «quem liga» = agente de voz). Cada contacto fica reservado 10 minutos e é verificado de novo: lista de oposição, consentimento/exceção de cliente nas chamadas comerciais, dias e horário da clínica, janela da lista, feriados, horas de silêncio e ambiente de execução. A ponte liga para «para» e, se atenderem, chama /ganchos/voz/sessao com o chamada_id e «modo»: «saida». Mesmo segredo e assinatura do motor de voz. Só com o motor próprio e as chamadas de saída ligadas.",
                "parameters": [
                    {
                        "name": "X-AX-Segredo",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Segredo do agente da clínica."
                    },
                    {
                        "name": "X-AX-Assinatura",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "sha256=<HMAC-SHA256 do corpo>"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "max": {
                                        "type": "integer",
                                        "minimum": 1,
                                        "maximum": 20,
                                        "default": 5
                                    }
                                }
                            },
                            "example": {
                                "max": 5
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Chamadas reservadas",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "type": "boolean"
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ativo": {
                                                    "type": "boolean"
                                                },
                                                "chamadas": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "chamada_id": {
                                                                "type": "string"
                                                            },
                                                            "para": {
                                                                "type": "string"
                                                            },
                                                            "de": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "lingua": {
                                                                "type": "string",
                                                                "enum": [
                                                                    "pt-PT",
                                                                    "pt-BR",
                                                                    "en",
                                                                    "es",
                                                                    "fr",
                                                                    "de"
                                                                ]
                                                            },
                                                            "lista_id": {
                                                                "type": "integer"
                                                            },
                                                            "contacto_id": {
                                                                "type": "integer"
                                                            },
                                                            "tipo": {
                                                                "type": "string"
                                                            },
                                                            "finalidade": {
                                                                "type": "string",
                                                                "enum": [
                                                                    "marketing",
                                                                    "servico"
                                                                ]
                                                            },
                                                            "expira_em": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ],
                                                                "format": "date-time"
                                                            },
                                                            "modo": {
                                                                "const": "saida"
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ativo": true,
                                        "chamadas": [
                                            {
                                                "chamada_id": "ax-s-9f2c71d04e",
                                                "para": "+351912345678",
                                                "de": "+351210000000",
                                                "lingua": "pt-PT",
                                                "lista_id": 7,
                                                "contacto_id": 311,
                                                "tipo": "confirmacoes",
                                                "finalidade": "servico",
                                                "expira_em": "2026-10-29T10:10:00+00:00",
                                                "modo": "saida"
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Segredo ou assinatura inválidos"
                    },
                    "409": {
                        "description": "Motor próprio desligado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/ganchos/voz/saida/resultado": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "post": {
                "tags": [
                    "Avisos de fornecedores (CRM)"
                ],
                "operationId": "vozSaidaResultado",
                "security": [],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "publico",
                "summary": "Agente de saída — chamada não atendida",
                "description": "Para as chamadas reservadas que não chegaram a /ganchos/voz/sessao. O contacto volta à fila até ao máximo de tentativas; «numero_errado» fecha-o. Uma chamada atendida termina em /ganchos/voz/fim, que regista o resultado (confirmou, cancelou, remarcou, interessado, pediu para não ser contactado, acompanhamento feito).",
                "parameters": [
                    {
                        "name": "X-AX-Segredo",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Segredo do agente da clínica."
                    },
                    {
                        "name": "X-AX-Assinatura",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "sha256=<HMAC-SHA256 do corpo>"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "chamada_id": {
                                        "type": "string"
                                    },
                                    "resultado": {
                                        "type": "string",
                                        "enum": [
                                            "nao_atendeu",
                                            "ocupado",
                                            "correio_voz",
                                            "numero_errado",
                                            "falhou",
                                            "rejeitada"
                                        ]
                                    }
                                },
                                "required": [
                                    "chamada_id"
                                ]
                            },
                            "example": {
                                "chamada_id": "ax-s-9f2c71d04e",
                                "resultado": "nao_atendeu"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Registado",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "type": "boolean"
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "contacto_id": {
                                                    "type": "integer"
                                                },
                                                "estado": {
                                                    "type": "string"
                                                },
                                                "resultado": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Segredo ou assinatura inválidos"
                    },
                    "404": {
                        "description": "Chamada desconhecida"
                    },
                    "422": {
                        "description": "Identificador inválido"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/ganchos/voz/sessao": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "post": {
                "tags": [
                    "Avisos de fornecedores (CRM)"
                ],
                "operationId": "vozSessao",
                "security": [],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "publico",
                "summary": "Motor de voz próprio — início da chamada",
                "description": "Chamado pela ponte telefónica da clínica quando entrega uma chamada ao agente (só com crm.agente.motor = proprio; 409 «motor_externo» caso contrário). Autenticação e clínica pelo segredo do agente (X-AX-Segredo ou X-AX-Assinatura). Cria o pedido do agente (canal voz, motor próprio) e devolve a saudação com o aviso de IA obrigatório na língua da chamada (a indicada, a do indicativo ou a das Definições). Se o agente não pode atender (desligado, fora do seu horário ou minutos do mês esgotados), devolve logo «transferir» (clínica aberta ou extensão definida) ou «terminar» com a mensagem de indisponibilidade. Repetir o início da mesma chamada devolve a mesma saudação. Limite: 300 por minuto e por IP.",
                "parameters": [
                    {
                        "name": "X-AX-Segredo",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Segredo do agente da clínica."
                    },
                    {
                        "name": "X-AX-Assinatura",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "sha256=<HMAC-SHA256 do corpo>"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "chamada_id": {
                                        "type": "string",
                                        "pattern": "^[A-Za-z0-9][A-Za-z0-9._:@-]{0,189}$",
                                        "description": "Identificador da chamada na ponte (único por clínica)."
                                    },
                                    "de": {
                                        "type": "string"
                                    },
                                    "para": {
                                        "type": "string"
                                    },
                                    "lingua": {
                                        "type": "string",
                                        "enum": [
                                            "pt-PT",
                                            "pt-BR",
                                            "en",
                                            "es",
                                            "fr",
                                            "de"
                                        ]
                                    },
                                    "nome": {
                                        "type": "string"
                                    },
                                    "gravacao_pedida": {
                                        "type": "boolean",
                                        "description": "A ponte vai gravar: a saudação inclui o aviso de gravação."
                                    },
                                    "gravacao_consentida": {
                                        "type": "boolean"
                                    },
                                    "audio_modo": {
                                        "type": "string",
                                        "enum": [
                                            "base64",
                                            "ligacao",
                                            "nenhum"
                                        ],
                                        "default": "base64"
                                    },
                                    "modo": {
                                        "type": "string",
                                        "enum": [
                                            "agente",
                                            "menu",
                                            "saida"
                                        ],
                                        "default": "agente",
                                        "description": "«menu»: o menu de voz do número «para» (ou o principal) atende; «saida»: chamada feita pelo agente com o chamada_id recebido em /ganchos/voz/saida. Em ambos, o início começa pelo aviso de privacidade em vigor da clínica para o telefone."
                                    }
                                },
                                "required": [
                                    "chamada_id"
                                ]
                            },
                            "example": {
                                "chamada_id": "pbx-7f3a-20261029-2214",
                                "de": "+351912345678",
                                "para": "+351210000000",
                                "gravacao_pedida": false,
                                "audio_modo": "base64"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Saudação",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "type": "boolean"
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmRespostaVoz"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "sessao": "pbx-7f3a-20261029-2214",
                                        "pedido_id": 912,
                                        "turno": 0,
                                        "lingua": "pt-PT",
                                        "texto": "Olá! Sou o assistente virtual da clínica (inteligência artificial). Posso ajudar com informações e marcações; a qualquer momento pode pedir para falar com uma pessoa. Em que posso ajudar?",
                                        "audio": {
                                            "formato": "wav",
                                            "mime": "audio/wav",
                                            "duracao_ms": 8120,
                                            "base64": "UklGRiQ…"
                                        },
                                        "acao": "continuar",
                                        "destino": null,
                                        "servicos": {
                                            "transcricao": null,
                                            "resposta": null,
                                            "fala": "local"
                                        },
                                        "max_segundos_fala": 60,
                                        "inicio": true
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Segredo ou assinatura inválidos"
                    },
                    "409": {
                        "description": "Motor próprio desligado ou chamada já terminada"
                    },
                    "422": {
                        "description": "Identificador da chamada inválido"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/ganchos/voz/turno": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "post": {
                "tags": [
                    "Avisos de fornecedores (CRM)"
                ],
                "operationId": "vozTurno",
                "security": [],
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "publico",
                "summary": "Motor de voz próprio — uma fala de quem liga",
                "description": "A ponte envia cada fala de quem liga: o áudio em WAV (base64, até 8 MB e até crm.agente.voz_max_segundos) ou o texto que ela própria já transcreveu. O servidor ouve (transcrição: serviço local primeiro, externo como recurso só com o interruptor dos dados de pacientes), verifica os sinais de alarme da clínica, os pedidos para falar com uma pessoa e os limites, responde só com a base de conhecimento aprovada e fala a resposta. Ações: «continuar» (tocar o áudio e gravar a fala seguinte), «transferir» (com destino: departamento e extensão/número) ou «terminar» (tocar e desligar). Sinal de alarme → tarefa urgente à enfermagem e «transferir» para a extensão de alarme. «sequencia» torna o pedido repetível: a mesma sequência devolve a mesma resposta sem voltar a ouvir. O áudio das falas nunca é guardado nem registado. Limites: 1800 por minuto e por IP; 30 por minuto e por chamada.",
                "parameters": [
                    {
                        "name": "X-AX-Segredo",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Segredo do agente da clínica."
                    },
                    {
                        "name": "X-AX-Assinatura",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "sha256=<HMAC-SHA256 do corpo>"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "chamada_id": {
                                        "type": "string"
                                    },
                                    "audio_base64": {
                                        "type": "string",
                                        "description": "WAV (PCM) da fala, em base64. O serviço local só aceita WAV; outros formatos (MP3, OGG, FLAC, WEBM, M4A) só pelo serviço externo."
                                    },
                                    "texto": {
                                        "type": "string",
                                        "maxLength": 2000,
                                        "description": "Em vez do áudio: o texto já transcrito pela ponte."
                                    },
                                    "sequencia": {
                                        "type": "integer",
                                        "minimum": 0
                                    },
                                    "gravacao_consentida": {
                                        "type": "boolean"
                                    },
                                    "audio_modo": {
                                        "type": "string",
                                        "enum": [
                                            "base64",
                                            "ligacao",
                                            "nenhum"
                                        ]
                                    },
                                    "digitos": {
                                        "type": "string",
                                        "pattern": "^[0-9*#]{1,12}$",
                                        "description": "Teclas marcadas (menu de voz ou código de identificação)."
                                    },
                                    "sem_resposta": {
                                        "type": "boolean",
                                        "description": "A pessoa não respondeu no tempo de «recolher.espera_s»."
                                    }
                                },
                                "required": [
                                    "chamada_id"
                                ]
                            },
                            "example": {
                                "chamada_id": "pbx-7f3a-20261029-2214",
                                "sequencia": 1,
                                "audio_base64": "UklGRiQ…"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Resposta do agente",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "type": "boolean"
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CrmRespostaVoz"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "sessao": "pbx-7f3a-20261029-2214",
                                        "pedido_id": 912,
                                        "turno": 1,
                                        "lingua": "pt-PT",
                                        "texto": "A clínica está aberta de segunda a sexta, das nove às dezanove. Quer que deixe um pedido de marcação para a receção confirmar?",
                                        "audio": {
                                            "formato": "wav",
                                            "mime": "audio/wav",
                                            "duracao_ms": 6400,
                                            "base64": "UklGRiQ…"
                                        },
                                        "acao": "continuar",
                                        "destino": null,
                                        "servicos": {
                                            "transcricao": "local",
                                            "resposta": "local",
                                            "fala": "local"
                                        },
                                        "max_segundos_fala": 60
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Segredo ou assinatura inválidos"
                    },
                    "404": {
                        "description": "Chamada desconhecida (comece por /ganchos/voz/sessao)"
                    },
                    "409": {
                        "description": "Motor próprio desligado ou chamada já terminada/transferida"
                    },
                    "413": {
                        "description": "Áudio demasiado grande"
                    },
                    "422": {
                        "description": "Sem áudio nem texto, áudio inválido ou demasiado longo"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    },
                    "500": {
                        "description": "Erro interno: a ponte deve passar a chamada a uma pessoa"
                    },
                    "503": {
                        "description": "Motor ainda por instalar no servidor"
                    }
                }
            }
        },
        "/ganchos/whatsapp": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "get": {
                "tags": [
                    "Avisos de fornecedores (CRM)"
                ],
                "operationId": "ganchoWhatsappVerificar",
                "security": [],
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "publico",
                "summary": "Verificação do endereço (WhatsApp Cloud)",
                "description": "Devolve hub.challenge em texto quando hub.verify_token coincide com o código de verificação de uma clínica ativa; 403 caso contrário.",
                "parameters": [
                    {
                        "name": "hub.mode",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "subscribe"
                            ]
                        },
                        "description": "Modo"
                    },
                    {
                        "name": "hub.verify_token",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Código de verificação"
                    },
                    {
                        "name": "hub.challenge",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Desafio"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Desafio",
                        "content": {
                            "text/plain": {
                                "schema": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Código inválido"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            },
            "post": {
                "tags": [
                    "Avisos de fornecedores (CRM)"
                ],
                "operationId": "ganchoWhatsappReceber",
                "security": [],
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "publico",
                "summary": "Mensagens e estados (WhatsApp, Instagram, Messenger)",
                "description": "Formato da Meta. A clínica é resolvida pela LINHA de WhatsApp que recebeu (metadata.phone_number_id = identificador de uma linha ativa; recurso ao número das Definições) ou pela página/conta (crm.meta.paginas) — nunca por omissão. A assinatura X-Hub-Signature-256 é verificada com o segredo da aplicação dessa clínica (WhatsApp ou crm.meta.app_secret; 401 se falhar). Efeitos: mensagem na caixa de entrada (a conversa guarda a linha e a conta que recebeu), lead novo para contactos desconhecidos, CONFIRMAR/STOP, fotografias para a galeria por verificar, estados de entrega (WhatsApp «statuses», Messenger «delivery» e «read», Instagram «read»), leads dos formulários de anúncios (page → changes[].field = «leadgen»: o lead é lido na Meta com a chave da clínica e criado pelo funil), resposta automática fora de horas ou pelo assistente virtual.",
                "parameters": [
                    {
                        "name": "X-Hub-Signature-256",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "sha256=<HMAC-SHA256 do corpo com o segredo da aplicação>"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object"
                            },
                            "example": {
                                "object": "whatsapp_business_account",
                                "entry": [
                                    {
                                        "id": "1029384756",
                                        "changes": [
                                            {
                                                "field": "messages",
                                                "value": {
                                                    "messaging_product": "whatsapp",
                                                    "metadata": {
                                                        "display_phone_number": "351210000000",
                                                        "phone_number_id": "109876543210"
                                                    },
                                                    "contacts": [
                                                        {
                                                            "profile": {
                                                                "name": "Ricardo"
                                                            },
                                                            "wa_id": "351912345678"
                                                        }
                                                    ],
                                                    "messages": [
                                                        {
                                                            "from": "351912345678",
                                                            "id": "wamid.HBgM…",
                                                            "timestamp": "1730107620",
                                                            "type": "text",
                                                            "text": {
                                                                "body": "CONFIRMAR"
                                                            }
                                                        }
                                                    ]
                                                }
                                            }
                                        ]
                                    }
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Recebido",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "type": "boolean"
                                        },
                                        "tratados": {
                                            "type": "integer"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Corpo inválido"
                    },
                    "401": {
                        "description": "Assinatura inválida ou clínica desconhecida"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/ia-propostas/{id}/decisao": {
            "post": {
                "tags": [
                    "Consultas"
                ],
                "operationId": "m1DecidirPropostaIa",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da proposta da IA"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Aceitar, corrigir ou recusar uma proposta da IA",
                "description": "Exige «editar» em ficha.clinica e o paciente no âmbito clínico; as propostas de triagem também podem ser decididas pela enfermagem, as restantes só por médicos (403). Só propostas pendentes (já decidida → 422). «aceite» usa o valor proposto, «corrigida» exige valor_final, «recusada» aceita um motivo (cortado a 400 caracteres). Numa consulta em rascunho o valor entra no campo (textos acrescentados ao que já estava; escala, grau, BASP e miniaturização substituídos); numa consulta assinada só fica a decisão (usa-se um aditamento). Efeitos: auditoria «aprovar» com o tipo, o campo e o modelo; quando aplica, a gravação da consulta e a respetiva auditoria. Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "decisao": {
                                        "type": "string",
                                        "enum": [
                                            "aceite",
                                            "corrigida",
                                            "recusada"
                                        ]
                                    },
                                    "valor_final": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "description": "Obrigatório com «corrigida»."
                                    },
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "maxLength": 400
                                    }
                                },
                                "required": [
                                    "decisao"
                                ]
                            },
                            "example": {
                                "decisao": "corrigida",
                                "valor_final": "Alergia a penicilina (urticária em 2019)."
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "proposta": {
                                                    "$ref": "#/components/schemas/M1PropostaIa"
                                                },
                                                "consulta": {
                                                    "oneOf": [
                                                        {
                                                            "$ref": "#/components/schemas/M1Consulta"
                                                        },
                                                        {
                                                            "type": "null"
                                                        }
                                                    ]
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "proposta": {
                                            "id": 9120,
                                            "paciente_id": 1204,
                                            "episodio_id": 77,
                                            "consulta_id": 4410,
                                            "resposta_id": null,
                                            "tipo": "escriba",
                                            "tipo_rotulo": "Escriba",
                                            "campo": "alergias",
                                            "campo_rotulo": "Alergias",
                                            "valor_proposto": "Alergia a penicilina (exantema).",
                                            "excerto_origem": "sou alérgico à penicilina, fiquei cheio de manchas",
                                            "fatores": {
                                                "excerto_verificado": true,
                                                "confianca_modelo": 0.92
                                            },
                                            "confianca": 0.92,
                                            "estado": "corrigida",
                                            "estado_rotulo": "Corrigida",
                                            "valor_final": "Alergia a penicilina (urticária em 2019).",
                                            "decidido_por": "Inês Valente",
                                            "decidido_em": "2026-10-28T10:30:00+00:00",
                                            "motivo": null,
                                            "lote": "3f2a9c0d6b1e4a7f8c2d5e9b0a1f3c4d",
                                            "criado_em": "2026-10-28T10:22:00+00:00"
                                        },
                                        "consulta": null
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/indicadores": {
            "get": {
                "tags": [
                    "Indicadores"
                ],
                "operationId": "listarGruposDeIndicadores",
                "summary": "Grupos visíveis, catálogo e opções dos filtros",
                "description": "Só os grupos que a matriz deixa ver (indicadores.financeiros|vendas|operacionais|atendimento). 403 se nenhum.",
                "x-anagen-modulo": "indicadores.vendas",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "indicadores.financeiros:ver"
                        ]
                    },
                    {
                        "integracao": [
                            "indicadores.vendas:ver"
                        ]
                    },
                    {
                        "integracao": [
                            "indicadores.operacionais:ver"
                        ]
                    },
                    {
                        "integracao": [
                            "indicadores.atendimento:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/GruposDeIndicadores"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/indicadores/{grupo}": {
            "get": {
                "tags": [
                    "Indicadores"
                ],
                "operationId": "calcularIndicadores",
                "summary": "Indicadores de um grupo",
                "description": "Cada indicador vem em blocos: «kpis» (valor, anterior, variação em %), «grafico» (séries com ligação para a lista filtrada) e, quando útil, «lista» ou «alerta». Indicadores cujos módulos ainda não existem na clínica vêm com disponivel=false e a lista do que falta.\n\nMédicos com âmbito «próprios» veem só os seus números. Nunca há conteúdo clínico — só agregados.",
                "x-anagen-modulo": "indicadores.vendas",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "indicadores.vendas:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "grupo",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "financeiros",
                                "vendas",
                                "operacionais",
                                "atendimento"
                            ]
                        },
                        "example": "vendas"
                    },
                    {
                        "name": "indicadores",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Só estes indicadores (lista separada por vírgulas).",
                        "example": "leads_origem,conversao"
                    },
                    {
                        "name": "periodo",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "mes",
                                "mes_anterior",
                                "30d",
                                "90d",
                                "trimestre",
                                "ano",
                                "ano_anterior",
                                "12m"
                            ]
                        },
                        "description": "Período pré-definido (omissão: mês corrente).",
                        "example": "30d"
                    },
                    {
                        "name": "de",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Início personalizado (com «ate»; sobrepõe-se a «periodo»).",
                        "example": "2026-10-01"
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Fim personalizado (inclusivo).",
                        "example": "2026-10-31"
                    },
                    {
                        "name": "medico_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Filtrar por médico (forçado para o próprio quando o âmbito é «próprios»)."
                    },
                    {
                        "name": "comercial_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Filtrar por comercial/receção responsável."
                    },
                    {
                        "name": "origem",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "site",
                                "pre_avaliacao",
                                "meta",
                                "google",
                                "whatsapp",
                                "instagram",
                                "messenger",
                                "telefone",
                                "presencial",
                                "recomendacao",
                                "agente_voz",
                                "outro"
                            ]
                        },
                        "description": "Origem do lead.",
                        "example": "meta"
                    },
                    {
                        "name": "procedimento_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Procedimento."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoIndicadores"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "grupo": "financeiros",
                                        "titulo": "Financeiros",
                                        "filtros": {
                                            "periodo": "mes",
                                            "de": "2026-10-01",
                                            "ate": "2026-10-28",
                                            "ant_de": "2026-09-01",
                                            "ant_ate": "2026-09-28"
                                        },
                                        "indicadores": [
                                            {
                                                "chave": "faturacao",
                                                "grupo": "financeiros",
                                                "titulo": "Faturação",
                                                "disponivel": true,
                                                "blocos": [
                                                    {
                                                        "tipo": "kpis",
                                                        "itens": [
                                                            {
                                                                "rotulo": "Faturação",
                                                                "valor": 48250,
                                                                "anterior": 41210.5,
                                                                "delta": 17.1,
                                                                "delta_rotulo": "vs. período anterior",
                                                                "formato": "moeda",
                                                                "unidade": "€",
                                                                "ligacao": {
                                                                    "web": "equipa/r/pagamentos?f[estado]=pago",
                                                                    "app": "/r/pagamentos?f[estado]=pago"
                                                                }
                                                            }
                                                        ]
                                                    }
                                                ]
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/indicadores/{grupo}/exportar": {
            "get": {
                "tags": [
                    "Indicadores"
                ],
                "operationId": "exportarIndicadores",
                "summary": "Exportar o grupo em CSV",
                "description": "CSV com separador «;», UTF-8 com BOM: indicador, métrica, série, x, valor, anterior, variação e unidade. Exige «exportar» no módulo do grupo e fica na auditoria.",
                "x-anagen-modulo": "indicadores.vendas",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "indicadores.vendas:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "grupo",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "financeiros",
                                "vendas",
                                "operacionais",
                                "atendimento"
                            ]
                        },
                        "example": "vendas"
                    },
                    {
                        "name": "periodo",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "mes",
                                "mes_anterior",
                                "30d",
                                "90d",
                                "trimestre",
                                "ano",
                                "ano_anterior",
                                "12m"
                            ]
                        },
                        "description": "Período pré-definido (omissão: mês corrente).",
                        "example": "30d"
                    },
                    {
                        "name": "de",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Início personalizado (com «ate»; sobrepõe-se a «periodo»).",
                        "example": "2026-10-01"
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Fim personalizado (inclusivo).",
                        "example": "2026-10-31"
                    },
                    {
                        "name": "medico_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Filtrar por médico (forçado para o próprio quando o âmbito é «próprios»)."
                    },
                    {
                        "name": "comercial_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Filtrar por comercial/receção responsável."
                    },
                    {
                        "name": "origem",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "site",
                                "pre_avaliacao",
                                "meta",
                                "google",
                                "whatsapp",
                                "instagram",
                                "messenger",
                                "telefone",
                                "presencial",
                                "recomendacao",
                                "agente_voz",
                                "outro"
                            ]
                        },
                        "description": "Origem do lead.",
                        "example": "meta"
                    },
                    {
                        "name": "procedimento_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Procedimento."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Ficheiro CSV",
                        "content": {
                            "text/csv": {
                                "schema": {
                                    "type": "string"
                                },
                                "example": "\"Indicador\";\"Métrica\";\"Série\";\"X\";\"Valor\";\"Anterior\";\"Variação\";\"Unidade\"\r\n\"Leads por origem\";\"Leads\";\"\";\"\";\"128\";\"104\";\"23,1\";\"leads\"\r\n"
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/integracoes/catalogo": {
            "get": {
                "tags": [
                    "Integrações"
                ],
                "operationId": "catalogoDeOperacoes",
                "summary": "Catálogo de operações",
                "description": "Todas as operações da API agrupadas por área, com a permissão exigida, se aceitam credenciais de integração e se são públicas, mais os eventos de webhook. Lido da especificação gerada — nunca diverge do código.",
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "lingua",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "pt",
                                "en"
                            ],
                            "default": "pt"
                        },
                        "description": "Língua dos resumos.",
                        "example": "pt"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "versao": {
                                                    "type": "string"
                                                },
                                                "servidor": {
                                                    "type": "string"
                                                },
                                                "total": {
                                                    "type": "integer"
                                                },
                                                "documentacao": {
                                                    "type": "string"
                                                },
                                                "referencia": {
                                                    "type": "string"
                                                },
                                                "openapi": {
                                                    "type": "string"
                                                },
                                                "grupos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "nome": {
                                                                "type": "string"
                                                            },
                                                            "descricao": {
                                                                "type": "string"
                                                            },
                                                            "operacoes": {
                                                                "type": "array",
                                                                "items": {
                                                                    "type": "object",
                                                                    "properties": {
                                                                        "id": {
                                                                            "type": "string"
                                                                        },
                                                                        "metodo": {
                                                                            "type": "string"
                                                                        },
                                                                        "caminho": {
                                                                            "type": "string"
                                                                        },
                                                                        "resumo": {
                                                                            "type": "string"
                                                                        },
                                                                        "modulo": {
                                                                            "type": [
                                                                                "string",
                                                                                "null"
                                                                            ]
                                                                        },
                                                                        "nivel": {
                                                                            "type": [
                                                                                "string",
                                                                                "null"
                                                                            ]
                                                                        },
                                                                        "integracao": {
                                                                            "type": "boolean"
                                                                        },
                                                                        "publico": {
                                                                            "type": "boolean"
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                },
                                                "webhooks": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "evento": {
                                                                "type": "string"
                                                            },
                                                            "resumo": {
                                                                "type": "string"
                                                            },
                                                            "descricao": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "versao": "1.0.0",
                                        "servidor": "https://clinica.exemplo.pt/api/v1",
                                        "total": 412,
                                        "documentacao": "https://clinica.exemplo.pt/desenvolvedores",
                                        "referencia": "https://clinica.exemplo.pt/desenvolvedores/referencia",
                                        "openapi": "https://clinica.exemplo.pt/api/v1/openapi.json",
                                        "grupos": [
                                            {
                                                "nome": "Tarefas",
                                                "descricao": "Tarefas da equipa.",
                                                "operacoes": [
                                                    {
                                                        "id": "listarTarefas",
                                                        "metodo": "GET",
                                                        "caminho": "/tarefas",
                                                        "resumo": "Listar tarefas",
                                                        "modulo": "equipa.tarefas",
                                                        "nivel": "ver",
                                                        "integracao": true,
                                                        "publico": false
                                                    }
                                                ]
                                            }
                                        ],
                                        "webhooks": [
                                            {
                                                "evento": "tarefa.criada",
                                                "resumo": "Tarefa criada",
                                                "descricao": ""
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/integracoes/consumo": {
            "get": {
                "tags": [
                    "Integrações"
                ],
                "operationId": "consumoDasIntegracoes",
                "summary": "Consumo das integrações",
                "description": "Pedidos por dia, erros (HTTP ≥ 400), duração média, últimos pedidos e entregas de webhooks, por credencial, em blocos §18.1.",
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "dias",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 90,
                            "default": 30
                        },
                        "description": "Janela em dias."
                    },
                    {
                        "name": "cliente",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Só uma integração."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ConsumoIntegracoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/licenca": {
            "get": {
                "tags": [
                    "A minha licença"
                ],
                "operationId": "aMinhaLicenca",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "ver",
                "summary": "Licença da clínica do pedido",
                "description": "Plano, módulos (incluídos ou não), limites e uso, validade, histórico sem motivos internos e contacto para renovar. Nunca a chave completa nem notas internas. Na clínica 1: plataforma = true.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/MinhaLicenca"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/licenca/estado": {
            "get": {
                "tags": [
                    "A minha licença"
                ],
                "operationId": "estadoDaLicenca",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "paciente": []
                    }
                ],
                "summary": "Estado leve da licença (banners)",
                "description": "Para qualquer conta autenticada (equipa ou paciente). Responde mesmo com a licença bloqueada, para a app explicar a situação. Pacientes não recebem datas do contrato.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EstadoLicenca"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "estado": "graca",
                                        "estado_rotulo": "Período de graça",
                                        "tom": "aviso",
                                        "so_leitura": true,
                                        "bloqueada": false,
                                        "fim": "2026-10-20",
                                        "dias_restantes": -8,
                                        "dias_graca": 15,
                                        "dias_graca_restantes": 7,
                                        "aviso": {
                                            "tom": "aviso",
                                            "titulo": "Modo só de leitura",
                                            "texto": "A licença terminou a 20/10/2026…"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    }
                }
            }
        },
        "/licencas": {
            "get": {
                "x-anagen-modulo": "plataforma.licencas",
                "x-anagen-nivel": "ver",
                "tags": [
                    "Licenças"
                ],
                "operationId": "listarLicencas",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Lista de licenças",
                "description": "Só superadministradores com o segundo fator ativo. Restantes contas: 403 so_superadmin (ou segundo_fator_necessario).",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "teste",
                                "ativa",
                                "graca",
                                "expirada",
                                "suspensa",
                                "cancelada"
                            ]
                        },
                        "description": "Estado efetivo."
                    },
                    {
                        "name": "f[plano]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "essencial",
                                "clinica",
                                "grupo",
                                "personalizado"
                            ]
                        }
                    },
                    {
                        "name": "f[expira]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "7",
                                "15",
                                "30",
                                "60",
                                "90"
                            ]
                        },
                        "description": "Termina em até N dias."
                    },
                    {
                        "name": "ordem",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "example": "fim:asc",
                        "description": "fim | clinica | plano | preco | criado_em, com :asc ou :desc."
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Licenca"
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "pagina": {
                                                    "type": "integer"
                                                },
                                                "por_pagina": {
                                                    "type": "integer"
                                                },
                                                "total": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            },
            "post": {
                "x-anagen-modulo": "plataforma.licencas",
                "x-anagen-nivel": "editar",
                "tags": [
                    "Licenças"
                ],
                "operationId": "criarClinicaELicenca",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Assistente: criar a clínica, a licença e o primeiro administrador",
                "description": "Numa transação cria (ou licencia, com clinica_id) a clínica, a licença com chave única, o subdomínio e os domínios próprios, o local principal, sincroniza os módulos ativos, prepara perfis, permissões e definições e cria o primeiro administrador. A seguir corre a preparação de cada módulo (resultado por módulo), grava o logótipo (≤ 1 MB) e envia o convite por email (ligação de uso único para palavra-passe e 2FA). Regista o evento «criada». ",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/PedidoNovaLicenca"
                            },
                            "example": {
                                "clinica_id": null,
                                "clinica": {
                                    "nome": "Clínica Capilar Porto",
                                    "nome_legal": "Clínica Capilar Porto, Lda.",
                                    "nif": "509999990",
                                    "ers_registo": "E123456",
                                    "pais": "PT",
                                    "morada": "Rua da Boavista, 100",
                                    "codigo_postal": "4050-110",
                                    "localidade": "Porto",
                                    "telefone": "+351 220 000 000",
                                    "email": "geral@clinicaporto.pt"
                                },
                                "marca": {
                                    "cor_marca": "#0E5B4F",
                                    "codigo": "PORTO-HAIR",
                                    "subdominio": "porto",
                                    "dominio_site": "www.clinicaporto.pt",
                                    "dominio_portal": null
                                },
                                "licenca": {
                                    "plano": "clinica",
                                    "estado": "ativa",
                                    "inicio": "2026-10-28",
                                    "fim": "2027-10-27",
                                    "dias_graca": 15,
                                    "renovacao_automatica": true,
                                    "modulos": [
                                        "crm.leads",
                                        "agenda"
                                    ],
                                    "max_utilizadores": 25,
                                    "max_armazenamento_gb": 500,
                                    "max_locais": 2,
                                    "preco": 590,
                                    "periodicidade": "mensal",
                                    "moeda": "EUR"
                                },
                                "administrador": {
                                    "nome": "Joana Pires",
                                    "email": "joana@clinicaporto.pt"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoNovaLicenca"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/licencas/dominios/{id}/apagar": {
            "post": {
                "x-anagen-modulo": "plataforma.licencas",
                "x-anagen-nivel": "editar",
                "tags": [
                    "Licenças"
                ],
                "operationId": "removerDominio",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Id do domínio."
                    }
                ],
                "summary": "Remover um domínio",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "apagado": {
                                                    "type": "boolean"
                                                },
                                                "id": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/licencas/dominios/{id}/principal": {
            "post": {
                "x-anagen-modulo": "plataforma.licencas",
                "x-anagen-nivel": "editar",
                "tags": [
                    "Licenças"
                ],
                "operationId": "tornarDominioPrincipal",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Id do domínio."
                    }
                ],
                "summary": "Tornar um domínio o principal",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Dominio"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/licencas/dominios/{id}/verificar": {
            "post": {
                "x-anagen-modulo": "plataforma.licencas",
                "x-anagen-nivel": "editar",
                "tags": [
                    "Licenças"
                ],
                "operationId": "verificarDominio",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Id do domínio."
                    }
                ],
                "summary": "Verificar um domínio (registo TXT)",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "allOf": [
                                                {
                                                    "$ref": "#/components/schemas/Dominio"
                                                },
                                                {
                                                    "type": "object",
                                                    "properties": {
                                                        "resultado": {
                                                            "type": "object",
                                                            "properties": {
                                                                "ok": {
                                                                    "type": "boolean"
                                                                },
                                                                "mensagem": {
                                                                    "type": "string"
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            ]
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/licencas/planos": {
            "get": {
                "x-anagen-modulo": "plataforma.licencas",
                "x-anagen-nivel": "ver",
                "tags": [
                    "Licenças"
                ],
                "operationId": "planosLicencas",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Planos, módulos licenciáveis e padrões",
                "description": "Os valores por omissão de cada plano vêm das definições da plataforma.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "planos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "modulos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "grupos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "padroes": {
                                                    "type": "object"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/licencas/responsaveis": {
            "get": {
                "x-anagen-modulo": "plataforma.licencas",
                "x-anagen-nivel": "ver",
                "tags": [
                    "Licenças"
                ],
                "operationId": "responsaveisLicencas",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Gestores de conta possíveis (equipa ativa da clínica 1)",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "integer"
                                                    },
                                                    "nome": {
                                                        "type": "string"
                                                    },
                                                    "email": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/licencas/resumo": {
            "get": {
                "x-anagen-modulo": "plataforma.licencas",
                "x-anagen-nivel": "ver",
                "tags": [
                    "Licenças"
                ],
                "operationId": "resumoLicencas",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Indicadores e gráficos das licenças",
                "description": "Clínicas ativas, em teste, a expirar em 30 dias, suspensas, receita recorrente mensal, uso de contas e armazenamento, distribuição por estado e por plano, receita dos últimos seis meses, licenças a terminar e clínicas sem licença. ",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResumoLicencas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/licencas/validar": {
            "post": {
                "x-anagen-modulo": "plataforma.licencas",
                "x-anagen-nivel": "editar",
                "tags": [
                    "Licenças"
                ],
                "operationId": "validarPassoAssistente",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Validar um passo do assistente",
                "description": "Passo 1 dados legais (NIF com dígito de controlo), 2 marca (código e subdomínio únicos), 3 licença, 4 administrador, 5 tudo. Erros com o campo prefixado (clinica.nif). Devolve sugestões de código e subdomínio a partir do nome.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "passo": {
                                        "type": "integer",
                                        "minimum": 1,
                                        "maximum": 5
                                    },
                                    "clinica_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "clinica": {
                                        "type": "object"
                                    },
                                    "marca": {
                                        "type": "object"
                                    },
                                    "licenca": {
                                        "type": "object"
                                    },
                                    "administrador": {
                                        "type": "object"
                                    }
                                },
                                "required": [
                                    "passo"
                                ]
                            },
                            "example": {
                                "passo": 1,
                                "clinica": {
                                    "nome": "Clínica Capilar Porto",
                                    "nome_legal": "Clínica Capilar Porto, Lda.",
                                    "nif": "509999990"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "valido": {
                                                    "type": "boolean"
                                                },
                                                "sugestoes": {
                                                    "type": "object",
                                                    "properties": {
                                                        "codigo": {
                                                            "type": "string"
                                                        },
                                                        "subdominio": {
                                                            "type": "string"
                                                        }
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "valido": true,
                                        "sugestoes": {
                                            "codigo": "CAPILAR-PORTO",
                                            "subdominio": "capilar-porto"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/licencas/{id}": {
            "get": {
                "x-anagen-modulo": "plataforma.licencas",
                "x-anagen-nivel": "ver",
                "tags": [
                    "Licenças"
                ],
                "operationId": "obterLicenca",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Detalhe de uma licença",
                "description": "Inclui domínios, histórico imutável e notas internas. Leitura auditada.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Id da licença."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Licenca"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 3,
                                        "chave": "7KQ2-9XHM-4TRA-PZ8C-W2LD",
                                        "chave_mascarada": "7KQ2-••••-••••-••••-W2LD",
                                        "clinica": {
                                            "id": 7,
                                            "nome": "Clínica Capilar Porto",
                                            "codigo": "PORTO-HAIR",
                                            "localidade": "Porto",
                                            "logotipo_url": null,
                                            "cor_marca": "#0E5B4F",
                                            "ativa": true
                                        },
                                        "plano": "clinica",
                                        "plano_rotulo": "Clínica",
                                        "estado": "ativa",
                                        "estado_efetivo": "ativa",
                                        "estado_rotulo": "Ativa",
                                        "tom": "sucesso",
                                        "so_leitura": false,
                                        "bloqueada": false,
                                        "inicio": "2026-10-28",
                                        "fim": "2027-10-27",
                                        "dias_restantes": 364,
                                        "dias_graca": 15,
                                        "dias_graca_restantes": null,
                                        "renovacao_automatica": true,
                                        "modulos": [
                                            "crm.leads",
                                            "agenda"
                                        ],
                                        "modulos_total": 2,
                                        "limites": {
                                            "utilizadores": 25,
                                            "armazenamento_gb": 500,
                                            "locais": 2
                                        },
                                        "uso": {
                                            "utilizadores": 11,
                                            "armazenamento_bytes": 53687091200,
                                            "armazenamento_gb": 50,
                                            "locais": 1
                                        },
                                        "percentagens": {
                                            "utilizadores": 44,
                                            "armazenamento": 10,
                                            "locais": 50
                                        },
                                        "preco": 590,
                                        "periodicidade": "mensal",
                                        "moeda": "EUR",
                                        "mrr": 590,
                                        "faturacao": {
                                            "nome": "Clínica Capilar Porto, Lda.",
                                            "nif": "509999990",
                                            "email": "contas@clinicaporto.pt"
                                        },
                                        "responsavel": {
                                            "id": 2,
                                            "nome": "Rita Matos"
                                        },
                                        "administrador": {
                                            "id": 41,
                                            "nome": "Joana Pires",
                                            "email": "joana@clinicaporto.pt",
                                            "estado": "convidado",
                                            "ultimo_acesso_em": null
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/licencas/{id}/cancelar": {
            "post": {
                "x-anagen-modulo": "plataforma.licencas",
                "x-anagen-nivel": "editar",
                "tags": [
                    "Licenças"
                ],
                "operationId": "cancelarLicenca",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Id da licença."
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Cancelar (motivo obrigatório)",
                "description": "Os dados ficam guardados; o acesso fica bloqueado; a renovação automática desliga-se. Evento «cancelada».",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": "string",
                                        "minLength": 5,
                                        "maxLength": 500
                                    }
                                },
                                "required": [
                                    "motivo"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Licenca"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/licencas/{id}/chave": {
            "post": {
                "x-anagen-modulo": "plataforma.licencas",
                "x-anagen-nivel": "editar",
                "tags": [
                    "Licenças"
                ],
                "operationId": "novaChaveLicenca",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Id da licença."
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Gerar nova chave",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "chave": {
                                                    "type": "string"
                                                },
                                                "chave_mascarada": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "chave": "9PLM-3QRT-XW4N-7HJK-2ZDA",
                                        "chave_mascarada": "9PLM-••••-••••-••••-2ZDA"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/licencas/{id}/convite": {
            "post": {
                "x-anagen-modulo": "plataforma.licencas",
                "x-anagen-nivel": "editar",
                "tags": [
                    "Licenças"
                ],
                "operationId": "reenviarConviteAdministrador",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Id da licença."
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Reenviar o convite ao primeiro administrador",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "enviado": {
                                                    "type": "boolean"
                                                },
                                                "email": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/licencas/{id}/dominios": {
            "post": {
                "x-anagen-modulo": "plataforma.licencas",
                "x-anagen-nivel": "editar",
                "tags": [
                    "Licenças"
                ],
                "operationId": "acrescentarDominio",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Id da licença."
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Acrescentar um domínio",
                "description": "Subdomínios do domínio base ficam verificados; domínios próprios esperam pelo registo TXT «anagensys-verificacao=<token>».",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "dominio": {
                                        "type": "string"
                                    },
                                    "tipo": {
                                        "type": "string",
                                        "enum": [
                                            "site",
                                            "portal",
                                            "ambos"
                                        ]
                                    },
                                    "principal": {
                                        "type": "boolean"
                                    }
                                },
                                "required": [
                                    "dominio"
                                ]
                            },
                            "example": {
                                "dominio": "www.clinicaporto.pt",
                                "tipo": "site"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Dominio"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/licencas/{id}/entrar": {
            "post": {
                "x-anagen-modulo": "plataforma.licencas",
                "x-anagen-nivel": "editar",
                "tags": [
                    "Licenças"
                ],
                "operationId": "entrarNaClinica",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Id da licença."
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Entrar na clínica (seletor de clínica)",
                "description": "A escolha fica associada à família do token (como POST /eu/clinica). Auditado e registado no histórico da licença.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "clinica_id": {
                                                    "type": "integer"
                                                },
                                                "nome": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/licencas/{id}/plano": {
            "post": {
                "x-anagen-modulo": "plataforma.licencas",
                "x-anagen-nivel": "editar",
                "tags": [
                    "Licenças"
                ],
                "operationId": "alterarPlanoLicenca",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Id da licença."
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Alterar plano, módulos, limites, datas, preço e faturação",
                "description": "Sincroniza os módulos ativos da clínica (os módulos fora da licença ficam ausentes do menu e recusados no servidor). Evento «alterada» com antes/depois.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "plano": {
                                        "type": "string",
                                        "enum": [
                                            "essencial",
                                            "clinica",
                                            "grupo",
                                            "personalizado"
                                        ]
                                    },
                                    "modulos": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        }
                                    },
                                    "max_utilizadores": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "max_armazenamento_gb": {
                                        "type": [
                                            "number",
                                            "null"
                                        ]
                                    },
                                    "max_locais": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "inicio": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date"
                                    },
                                    "fim": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date"
                                    },
                                    "dias_graca": {
                                        "type": "integer"
                                    },
                                    "renovacao_automatica": {
                                        "type": "boolean"
                                    },
                                    "preco": {
                                        "type": "number"
                                    },
                                    "periodicidade": {
                                        "type": "string",
                                        "enum": [
                                            "mensal",
                                            "anual"
                                        ]
                                    },
                                    "moeda": {
                                        "type": "string",
                                        "enum": [
                                            "EUR",
                                            "GBP",
                                            "BRL"
                                        ]
                                    },
                                    "faturacao_nome": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "faturacao_nif": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "faturacao_email": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "responsavel_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "notas": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "plano": "grupo",
                                "modulos": [
                                    "crm.leads",
                                    "agenda",
                                    "bloco.mapa"
                                ],
                                "max_utilizadores": 80,
                                "max_armazenamento_gb": 2000,
                                "max_locais": 10,
                                "preco": 1490,
                                "periodicidade": "mensal"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Licenca"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/licencas/{id}/preparar": {
            "post": {
                "x-anagen-modulo": "plataforma.licencas",
                "x-anagen-nivel": "editar",
                "tags": [
                    "Licenças"
                ],
                "operationId": "prepararClinica",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Id da licença."
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Repetir a preparação da clínica (idempotente)",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/PreparacaoModulo"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/licencas/{id}/reativar": {
            "post": {
                "x-anagen-modulo": "plataforma.licencas",
                "x-anagen-nivel": "editar",
                "tags": [
                    "Licenças"
                ],
                "operationId": "reativarLicenca",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Id da licença."
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Reativar uma licença suspensa ou cancelada",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Licenca"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/licencas/{id}/renovar": {
            "post": {
                "x-anagen-modulo": "plataforma.licencas",
                "x-anagen-nivel": "editar",
                "tags": [
                    "Licenças"
                ],
                "operationId": "renovarLicenca",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Id da licença."
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Renovar",
                "description": "Sem «fim», soma um período (mensal/anual) ao fim atual ou a hoje, se já passou. Licença expirada volta a ativa; suspensa continua suspensa; cancelada é recusada. Evento «renovada».",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "fim": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date"
                                    },
                                    "periodo": {
                                        "type": "string",
                                        "enum": [
                                            "mensal",
                                            "anual"
                                        ]
                                    },
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "periodo": "anual"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Licenca"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/licencas/{id}/suspender": {
            "post": {
                "x-anagen-modulo": "plataforma.licencas",
                "x-anagen-nivel": "editar",
                "tags": [
                    "Licenças"
                ],
                "operationId": "suspenderLicenca",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Id da licença."
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Suspender (motivo obrigatório)",
                "description": "Bloqueio imediato da equipa, do portal e da API da clínica (403 licenca_suspensa). Avisa a administração da clínica por email, sem o motivo interno. Evento «suspensa».",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": "string",
                                        "minLength": 5,
                                        "maxLength": 500
                                    }
                                },
                                "required": [
                                    "motivo"
                                ]
                            },
                            "example": {
                                "motivo": "Faturas de setembro e outubro por pagar."
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Licenca"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/m/a/{codigo}/{assinatura}": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "get": {
                "tags": [
                    "Chat do site e subscrições"
                ],
                "operationId": "marketingAbertura",
                "security": [],
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "publico",
                "summary": "Abertura de um email de campanha",
                "description": "Imagem de 1×1 incluída só nos emails comerciais com a medição ligada e para quem deu consentimento explícito. Assinatura HMAC do código («.gif» no fim). Regista a primeira abertura e o número de aberturas do envio, sem guardar endereço, aparelho nem navegador. Responde sempre com o mesmo GIF, sem cookies nem cache.",
                "parameters": [
                    {
                        "name": "codigo",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^[A-Za-z0-9_-]{16,128}$"
                        },
                        "description": "Código do envio"
                    },
                    {
                        "name": "assinatura",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^[a-f0-9]{16}\\.gif$"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Imagem",
                        "content": {
                            "image/gif": {
                                "schema": {
                                    "type": "string",
                                    "format": "binary"
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/m/c/{codigo}": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "get": {
                "tags": [
                    "Chat do site e subscrições"
                ],
                "operationId": "marketingClique",
                "security": [],
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "publico",
                "summary": "Registo de clique numa campanha",
                "description": "Regista o clique (ligação «l» do email) no envio e redireciona para o destino original. Destinos sempre do próprio conteúdo aprovado, nunca do pedido.",
                "parameters": [
                    {
                        "name": "codigo",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^[A-Za-z0-9_-]{16,128}$"
                        },
                        "description": "Código do envio"
                    },
                    {
                        "name": "l",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "minimum": 0
                        },
                        "description": "Índice da ligação no conteúdo"
                    },
                    {
                        "name": "s",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "pattern": "^[a-f0-9]{16}$"
                        },
                        "description": "Assinatura da ligação (os emails novos levam-na; uma assinatura errada é recusada)"
                    }
                ],
                "responses": {
                    "302": {
                        "description": "Redireciona para o destino"
                    },
                    "404": {
                        "description": "Código desconhecido"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/marketing/campanhas/{id}": {
            "get": {
                "tags": [
                    "Campanhas de marketing"
                ],
                "operationId": "mktObterCampanha",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "ver",
                "summary": "Editor da campanha",
                "description": "Campanha, blocos, imagens utilizáveis no canal, segmentos, avisos (preços sem IVA, garantias de resultado), rodapé legal e permissões. Também acessível à direção clínica sem permissão de marketing, para aprovar.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/MktEditorCampanha"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "campanha": {
                                            "id": 21,
                                            "nome": "Novidades de outono",
                                            "canal": "email",
                                            "tipo": "novidade",
                                            "finalidade": "marketing",
                                            "segmento_id": 3,
                                            "assunto": "Novidades na clínica este outono",
                                            "pre_cabecalho": "Novo horário ao sábado e sessões de esclarecimento",
                                            "conteudo": null,
                                            "estado": "aprovada",
                                            "estado_rotulo": "Aprovada",
                                            "aprovado_por": "Dr. Paulo Faria",
                                            "aprovado_em": "2026-10-27T17:02:00+00:00",
                                            "aprovacao_nota": null,
                                            "aprovacao_pedida_por": "Sofia Martins",
                                            "agendada_para": null,
                                            "enviada_em": null,
                                            "total": 0,
                                            "entregues": 0,
                                            "cliques": 0,
                                            "anulacoes": 0,
                                            "conversoes": 0,
                                            "editavel": false
                                        },
                                        "blocos": [
                                            {
                                                "tipo": "titulo",
                                                "texto": "Abrimos ao sábado"
                                            },
                                            {
                                                "tipo": "texto",
                                                "html": "<p>A partir de novembro, a clínica recebe consultas de avaliação ao sábado de manhã.</p>"
                                            },
                                            {
                                                "tipo": "imagem",
                                                "imagem_id": 5,
                                                "legenda": "A nossa receção"
                                            },
                                            {
                                                "tipo": "botao",
                                                "texto": "Marcar avaliação",
                                                "url": "https://clinica.exemplo.pt/marcar"
                                            },
                                            {
                                                "tipo": "divisoria"
                                            }
                                        ],
                                        "imagens": [],
                                        "segmentos": [
                                            {
                                                "id": 3,
                                                "nome": "Clientes sem visita há um ano",
                                                "contagem": 418,
                                                "usa_dados_clinicos": false
                                            }
                                        ],
                                        "avisos": [],
                                        "rodape": [],
                                        "permissoes": {
                                            "editar": true,
                                            "aprovar": false
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            },
            "put": {
                "tags": [
                    "Campanhas de marketing"
                ],
                "operationId": "mktGravarCampanha",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "summary": "Gravar a campanha",
                "description": "Só em rascunho (409 noutros estados). Blocos validados: HTML sanitizado, ligações https/mailto/tel, imagens da biblioteca com consentimento válido para o canal (422 com o motivo). Campanhas de SMS e WhatsApp usam «conteudo» (até 640 caracteres no SMS).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "nome": {
                                        "type": "string",
                                        "maxLength": 120
                                    },
                                    "canal": {
                                        "type": "string",
                                        "enum": [
                                            "email",
                                            "sms",
                                            "whatsapp"
                                        ]
                                    },
                                    "tipo": {
                                        "type": "string",
                                        "enum": [
                                            "informacao",
                                            "novidade",
                                            "evento",
                                            "avaliacao",
                                            "reativacao"
                                        ]
                                    },
                                    "finalidade": {
                                        "type": "string",
                                        "enum": [
                                            "marketing",
                                            "servico"
                                        ]
                                    },
                                    "segmento_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "assunto": {
                                        "type": "string",
                                        "maxLength": 190
                                    },
                                    "pre_cabecalho": {
                                        "type": "string",
                                        "maxLength": 190
                                    },
                                    "blocos": {
                                        "type": "array",
                                        "items": {
                                            "$ref": "#/components/schemas/MktBloco"
                                        }
                                    },
                                    "conteudo": {
                                        "type": "string",
                                        "maxLength": 4000
                                    }
                                }
                            },
                            "example": {
                                "nome": "Novidades de outono",
                                "canal": "email",
                                "tipo": "novidade",
                                "finalidade": "marketing",
                                "segmento_id": 3,
                                "assunto": "Novidades na clínica este outono",
                                "pre_cabecalho": "Novo horário ao sábado",
                                "blocos": [
                                    {
                                        "tipo": "titulo",
                                        "texto": "Abrimos ao sábado"
                                    },
                                    {
                                        "tipo": "texto",
                                        "html": "<p>A partir de novembro, a clínica recebe consultas de avaliação ao sábado de manhã.</p>"
                                    },
                                    {
                                        "tipo": "imagem",
                                        "imagem_id": 5,
                                        "legenda": "A nossa receção"
                                    },
                                    {
                                        "tipo": "botao",
                                        "texto": "Marcar avaliação",
                                        "url": "https://clinica.exemplo.pt/marcar"
                                    },
                                    {
                                        "tipo": "divisoria"
                                    }
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/MktEditorCampanha"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/marketing/campanhas/{id}/agendar": {
            "post": {
                "tags": [
                    "Campanhas de marketing"
                ],
                "operationId": "mktAgendarCampanha",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "summary": "Agendar o envio",
                "description": "Só aprovada e com o mesmo conteúdo aprovado (409 caso contrário). O envio é feito em lotes pelo agendador, dentro das horas permitidas, com o arquivo do conteúdo enviado. Efeitos: webhook campanha.enviada no fim.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "agendada_para": {
                                        "type": "string",
                                        "format": "date-time"
                                    }
                                },
                                "required": [
                                    "agendada_para"
                                ]
                            },
                            "example": {
                                "agendada_para": "2026-11-03T10:00:00+00:00"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/MktEditorCampanha"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/marketing/campanhas/{id}/aprovar": {
            "post": {
                "tags": [
                    "Campanhas de marketing"
                ],
                "operationId": "mktAprovarCampanha",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "aprovar",
                "summary": "Aprovar ou devolver (direção clínica)",
                "description": "Só a direção clínica (403 para os outros). Devolver exige a nota. Efeitos: notificação a quem pediu, auditoria «aprovar».",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "decisao": {
                                        "type": "string",
                                        "enum": [
                                            "aprovar",
                                            "devolver"
                                        ]
                                    },
                                    "nota": {
                                        "type": "string",
                                        "maxLength": 1000
                                    }
                                },
                                "required": [
                                    "decisao"
                                ]
                            },
                            "example": {
                                "decisao": "aprovar"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/MktEditorCampanha"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/marketing/campanhas/{id}/cancelar": {
            "post": {
                "tags": [
                    "Campanhas de marketing"
                ],
                "operationId": "mktCancelarCampanha",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "summary": "Cancelar a campanha",
                "description": "Até ao fim do envio; os envios por fazer ficam como não enviados («cancelada»).",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/MktEditorCampanha"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    }
                }
            }
        },
        "/marketing/campanhas/{id}/contar": {
            "post": {
                "tags": [
                    "Campanhas de marketing"
                ],
                "operationId": "mktContarPublico",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "ver",
                "summary": "Contar quem pode receber",
                "description": "Recalcula o segmento e aplica, contacto a contacto, as regras de envio (consentimento ou exceção de cliente, lista de oposição, contacto no canal, dupla adesão, consentimento explícito quando o segmento usa dados clínicos).",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "total": {
                                                    "type": "integer"
                                                },
                                                "enviaveis": {
                                                    "type": "integer"
                                                },
                                                "motivos": {
                                                    "type": "object",
                                                    "additionalProperties": {
                                                        "type": "integer"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "total": 512,
                                        "enviaveis": 418,
                                        "motivos": {
                                            "sem_consentimento": 61,
                                            "suprimido": 9,
                                            "sem_contacto": 24
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/marketing/campanhas/{id}/estatisticas": {
            "get": {
                "tags": [
                    "Campanhas de marketing"
                ],
                "operationId": "mktEstatisticasCampanha",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "ver",
                "summary": "Estatísticas da campanha",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "total": {
                                                    "type": "integer"
                                                },
                                                "entregues": {
                                                    "type": "integer"
                                                },
                                                "cliques": {
                                                    "type": "integer"
                                                },
                                                "anulacoes": {
                                                    "type": "integer"
                                                },
                                                "conversoes": {
                                                    "type": "integer"
                                                },
                                                "bloqueados": {
                                                    "type": "integer"
                                                },
                                                "falhados": {
                                                    "type": "integer"
                                                },
                                                "funil": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "x": {
                                                                "type": "string"
                                                            },
                                                            "y": {
                                                                "type": "number"
                                                            },
                                                            "serie": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            }
                                                        }
                                                    }
                                                },
                                                "cliques_por_dia": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "x": {
                                                                "type": "string"
                                                            },
                                                            "y": {
                                                                "type": "number"
                                                            },
                                                            "serie": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            }
                                                        }
                                                    }
                                                },
                                                "bloqueios": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "x": {
                                                                "type": "string"
                                                            },
                                                            "y": {
                                                                "type": "number"
                                                            },
                                                            "serie": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            }
                                                        }
                                                    }
                                                },
                                                "arquivo": {
                                                    "type": [
                                                        "object",
                                                        "array"
                                                    ],
                                                    "description": "Cópia do conteúdo tal como foi enviado."
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "total": 418,
                                        "entregues": 401,
                                        "cliques": 57,
                                        "anulacoes": 3,
                                        "conversoes": 4,
                                        "bloqueados": 94,
                                        "falhados": 2,
                                        "funil": [
                                            {
                                                "x": "Público",
                                                "y": 418
                                            }
                                        ],
                                        "cliques_por_dia": [
                                            {
                                                "x": "2026-10-29",
                                                "y": 41,
                                                "serie": "Cliques"
                                            }
                                        ],
                                        "bloqueios": [
                                            {
                                                "x": "Sem consentimento",
                                                "y": 61
                                            }
                                        ],
                                        "arquivo": []
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/marketing/campanhas/{id}/pedir-aprovacao": {
            "post": {
                "tags": [
                    "Campanhas de marketing"
                ],
                "operationId": "mktPedirAprovacao",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "summary": "Pedir a aprovação clínica",
                "description": "Só um rascunho com conteúdo e segmento. Guarda a impressão do conteúdo; qualquer alteração posterior obriga a nova aprovação. Efeitos: notificação à direção clínica.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/MktEditorCampanha"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/marketing/campanhas/{id}/pre-visualizar": {
            "post": {
                "tags": [
                    "Campanhas de marketing"
                ],
                "operationId": "mktPreVisualizar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "ver",
                "summary": "Pré-visualizar (sem gravar)",
                "description": "Desenha a mensagem tal como o contacto a recebe, com o rodapé legal e a ligação para deixar de receber, a partir do rascunho enviado (ou do gravado).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "rascunho": {
                                        "type": "object",
                                        "properties": {
                                            "assunto": {
                                                "type": "string"
                                            },
                                            "pre_cabecalho": {
                                                "type": "string"
                                            },
                                            "blocos": {
                                                "type": "array",
                                                "items": {
                                                    "$ref": "#/components/schemas/MktBloco"
                                                }
                                            },
                                            "conteudo": {
                                                "type": "string"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "rascunho": {
                                    "assunto": "Novidades na clínica este outono",
                                    "blocos": [
                                        {
                                            "tipo": "titulo",
                                            "texto": "Abrimos ao sábado"
                                        },
                                        {
                                            "tipo": "texto",
                                            "html": "<p>A partir de novembro, a clínica recebe consultas de avaliação ao sábado de manhã.</p>"
                                        },
                                        {
                                            "tipo": "imagem",
                                            "imagem_id": 5,
                                            "legenda": "A nossa receção"
                                        },
                                        {
                                            "tipo": "botao",
                                            "texto": "Marcar avaliação",
                                            "url": "https://clinica.exemplo.pt/marcar"
                                        },
                                        {
                                            "tipo": "divisoria"
                                        }
                                    ]
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "canal": {
                                                    "type": "string"
                                                },
                                                "html": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "texto": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "avisos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "canal": "email",
                                        "html": "<!doctype html><html>…</html>",
                                        "texto": null,
                                        "avisos": []
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/marketing/campanhas/{id}/teste": {
            "post": {
                "tags": [
                    "Campanhas de marketing"
                ],
                "operationId": "mktTesteCampanha",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "summary": "Enviar um email de teste para mim",
                "description": "Só campanhas de email; o teste vai para o email de quem chama. Limite: 10 em 10 minutos.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ok": {
                                                    "type": "boolean"
                                                },
                                                "erro": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ok": true,
                                        "erro": null
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/marketing/conversoes": {
            "get": {
                "tags": [
                    "Resultados de marketing"
                ],
                "operationId": "mktConversoes",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "ver",
                "summary": "Conversões para as plataformas de anúncios",
                "description": "Leads com identificador de clique que chegaram a consulta marcada, cirurgia marcada ou ganho, para a clínica devolver às plataformas de anúncios. Lista vazia quando a opção não está ligada nas Definições (só com base legal). Sem dados pessoais: só o identificador do clique.",
                "parameters": [
                    {
                        "name": "de",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Início"
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Fim"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "clique_id": {
                                                        "type": "string"
                                                    },
                                                    "conversao": {
                                                        "type": "string"
                                                    },
                                                    "origem": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "campanha": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "em": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ],
                                                        "format": "date-time"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "clique_id": "fb.1.1730100000.AbCdEf",
                                            "conversao": "consulta_marcada",
                                            "origem": "facebook",
                                            "campanha": "capilar-outono",
                                            "em": "2026-10-28T08:47:00+00:00"
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/marketing/custos/importar": {
            "post": {
                "tags": [
                    "Resultados de marketing"
                ],
                "operationId": "mktImportarCustos",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "summary": "Importar custos de anúncios (CSV)",
                "description": "Ficheiro CSV (campo «ficheiro», até 5 MB, tipo verificado pelo conteúdo) ou o texto em «csv». Colunas obrigatórias: plataforma, campanha, data, custo; opcionais: impressoes, cliques, leads. Separador vírgula ou ponto e vírgula; decimais com vírgula ou ponto. A mesma plataforma + campanha + data atualiza a linha existente. Limite: 20 em 10 minutos.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ficheiro"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary"
                                    }
                                }
                            }
                        },
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "csv"
                                ],
                                "properties": {
                                    "csv": {
                                        "type": "string"
                                    }
                                }
                            },
                            "example": {
                                "csv": "plataforma;campanha;data;custo;impressoes;cliques;leads\nmeta;capilar-outono;2026-10-27;84,50;6100;102;3"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "importadas": {
                                                    "type": "integer"
                                                },
                                                "atualizadas": {
                                                    "type": "integer"
                                                },
                                                "erros": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "importadas": 1,
                                        "atualizadas": 0,
                                        "erros": []
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/marketing/integracoes": {
            "get": {
                "tags": [
                    "Resultados de marketing"
                ],
                "operationId": "mktIntegracoes",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "ver",
                "summary": "Canais e integrações",
                "description": "Estado de cada ligação (leads dos anúncios, Instagram e Messenger, linhas de WhatsApp, conversões, custos, públicos, datas especiais, plataforma de email, aberturas), o que falta nas Definições, endereços de receção, últimos leads recebidos e fila de conversões. Os mesmos dados do ecrã web.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/MktIntegracoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/marketing/integracoes/{acao}": {
            "post": {
                "tags": [
                    "Resultados de marketing"
                ],
                "operationId": "mktIntegracoesAcao",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "summary": "Ação manual de uma integração",
                "description": "meta_testar, meta_subscrever (admin.definicoes editar), google_testar, leads_reprocessar (crm.leads editar), conversoes_enviar, custos_sincronizar (corpo: dias ≤ 90), email_sincronizar, email_testar, publico_enviar (corpo: id), datas_processar — as restantes exigem marketing editar. Auditado. Limite: 30 em 10 minutos.",
                "parameters": [
                    {
                        "name": "acao",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "meta_testar",
                                "meta_subscrever",
                                "google_testar",
                                "leads_reprocessar",
                                "conversoes_enviar",
                                "custos_sincronizar",
                                "email_sincronizar",
                                "email_testar",
                                "publico_enviar",
                                "datas_processar"
                            ]
                        }
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "id": {
                                        "type": "integer"
                                    },
                                    "dias": {
                                        "type": "integer"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                },
                                                "resultado": {
                                                    "type": "object"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "mensagem": "Aplicação subscrita em 2 de 2 páginas.",
                                        "resultado": []
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/marketing/publicos/{id}/exportar": {
            "get": {
                "tags": [
                    "Resultados de marketing"
                ],
                "operationId": "mktPublicoExportar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "name": "formato",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "meta",
                                "google"
                            ]
                        },
                        "description": "Formato do ficheiro"
                    }
                ],
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "summary": "Exportar um público para anúncios (CSV)",
                "description": "Só pessoas com consentimento explícito de marketing, fora da lista de oposição; email, telefone, nome e apelido em resumo SHA-256 normalizado. Auditado. Limite: 20 em 10 minutos.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "nome": {
                                                    "type": "string"
                                                },
                                                "csv": {
                                                    "type": "string"
                                                },
                                                "total": {
                                                    "type": "integer"
                                                },
                                                "excluidos": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/marketing/resultados": {
            "get": {
                "tags": [
                    "Resultados de marketing"
                ],
                "operationId": "mktResultados",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "ver",
                "summary": "Custos e resultados por campanha",
                "description": "Cruza o investimento importado com os leads reais (pela campanha ou utm_campaign) e com as fases de consulta e cirurgia marcadas. Por omissão os últimos 90 dias.",
                "parameters": [
                    {
                        "name": "de",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Início"
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Fim"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/MktResultados"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "de": "2026-08-01",
                                        "ate": "2026-10-28",
                                        "linhas": [
                                            {
                                                "plataforma": "meta",
                                                "plataforma_rotulo": "Meta",
                                                "campanha": "capilar-outono",
                                                "custo": 2450,
                                                "impressoes": 182000,
                                                "cliques": 3110,
                                                "leads_plataforma": 96,
                                                "leads": 88,
                                                "consultas": 21,
                                                "cirurgias": 6,
                                                "custo_por_lead": 27.84,
                                                "custo_por_consulta": 116.67,
                                                "custo_por_cirurgia": 408.33
                                            }
                                        ],
                                        "totais": {
                                            "custo": 2450,
                                            "leads": 88,
                                            "consultas": 21,
                                            "cirurgias": 6
                                        },
                                        "leads_por_origem": [
                                            {
                                                "x": "Meta (anúncios)",
                                                "y": 88,
                                                "origem": "meta"
                                            }
                                        ],
                                        "custo_por_dia": []
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/menu": {
            "get": {
                "tags": [
                    "Sessão"
                ],
                "operationId": "menu",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "paciente": []
                    }
                ],
                "summary": "Menu filtrado pelas permissões",
                "description": "Lista de grupos {chave, titulo, icone, itens}. Cada item: {chave, titulo, icone, url, web, rota, tipo: recurso|ecra, recurso?, app?, contador, ajuda, ativo}.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "chave": {
                                                        "type": "string"
                                                    },
                                                    "titulo": {
                                                        "type": "string"
                                                    },
                                                    "icone": {
                                                        "type": "string"
                                                    },
                                                    "itens": {
                                                        "type": "array",
                                                        "items": {
                                                            "type": "object"
                                                        }
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    }
                }
            }
        },
        "/modelos-ia/estado": {
            "get": {
                "tags": [
                    "Modelos de IA"
                ],
                "operationId": "modelosIaEstado",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Estado e escolhas por uso",
                "description": "Por uso: rótulo, descrição, área, campos aplicáveis, valores resolvidos com a origem (definição | omissão do servidor), interruptores e pode_editar. Só a equipa da clínica 1 com Definições › Editar altera.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "areas": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "string"
                                                            },
                                                            "rotulo": {
                                                                "type": "string"
                                                            },
                                                            "icone": {
                                                                "type": "string"
                                                            },
                                                            "usos": {
                                                                "type": "array",
                                                                "items": {
                                                                    "type": "string"
                                                                }
                                                            }
                                                        }
                                                    }
                                                },
                                                "usos": {
                                                    "type": "object",
                                                    "additionalProperties": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "string"
                                                            },
                                                            "rotulo": {
                                                                "type": "string"
                                                            },
                                                            "descricao": {
                                                                "type": "string"
                                                            },
                                                            "area": {
                                                                "type": "string"
                                                            },
                                                            "visao": {
                                                                "type": "boolean"
                                                            },
                                                            "texto": {
                                                                "type": "boolean"
                                                            },
                                                            "transcricao": {
                                                                "type": "boolean"
                                                            },
                                                            "fala": {
                                                                "type": "boolean"
                                                            },
                                                            "tipos": {
                                                                "type": "array",
                                                                "items": {
                                                                    "type": "string",
                                                                    "enum": [
                                                                        "visao",
                                                                        "texto",
                                                                        "transcricao",
                                                                        "fala"
                                                                    ]
                                                                }
                                                            },
                                                            "campos": {
                                                                "type": "array",
                                                                "items": {
                                                                    "type": "string"
                                                                }
                                                            },
                                                            "ollama_visao": {
                                                                "type": "object"
                                                            },
                                                            "ollama_texto": {
                                                                "type": "object"
                                                            },
                                                            "ollama_transcricao": {
                                                                "type": "object"
                                                            },
                                                            "ollama_fala": {
                                                                "type": "object"
                                                            },
                                                            "openrouter_modelos": {
                                                                "type": "object"
                                                            },
                                                            "openrouter_transcricao": {
                                                                "type": "object"
                                                            },
                                                            "openrouter_fala": {
                                                                "type": "object"
                                                            },
                                                            "vozes": {
                                                                "type": [
                                                                    "object",
                                                                    "null"
                                                                ],
                                                                "description": "{ollama: {língua: voz}, openrouter: {língua: voz}}"
                                                            },
                                                            "fala_linguas": {
                                                                "type": [
                                                                    "object",
                                                                    "null"
                                                                ],
                                                                "description": "Línguas que o modelo local de fala serve: {definido, efetivo, origem, omissao}."
                                                            },
                                                            "linguas_voz": {
                                                                "type": "array",
                                                                "items": {
                                                                    "type": "string"
                                                                }
                                                            },
                                                            "ollama_ativo": {
                                                                "type": "object"
                                                            },
                                                            "openrouter_ativo": {
                                                                "type": "object"
                                                            },
                                                            "openrouter_dados": {
                                                                "type": "object"
                                                            },
                                                            "configurado": {
                                                                "type": "boolean"
                                                            },
                                                            "configurado_tipos": {
                                                                "type": "object",
                                                                "additionalProperties": {
                                                                    "type": "boolean"
                                                                }
                                                            },
                                                            "pode_editar": {
                                                                "type": "boolean"
                                                            }
                                                        }
                                                    }
                                                },
                                                "tem_chave_openrouter": {
                                                    "type": "boolean"
                                                },
                                                "max_openrouter": {
                                                    "type": "integer"
                                                },
                                                "host_local": {
                                                    "type": "boolean"
                                                },
                                                "editavel": {
                                                    "type": "boolean"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/modelos-ia/guardar": {
            "post": {
                "tags": [
                    "Modelos de IA"
                ],
                "operationId": "modelosIaGuardar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Guardar escolhas de um uso",
                "description": "Uso desconhecido → 422. Só os campos aplicáveis ao uso são aceites.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "uso": {
                                        "type": "string"
                                    },
                                    "ollama_visao": {
                                        "type": "string"
                                    },
                                    "ollama_texto": {
                                        "type": "string"
                                    },
                                    "ollama_transcricao": {
                                        "type": "string"
                                    },
                                    "ollama_fala": {
                                        "type": "string"
                                    },
                                    "ollama_imagem": {
                                        "type": "string"
                                    },
                                    "openrouter": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        }
                                    },
                                    "openrouter_transcricao": {
                                        "type": "string"
                                    },
                                    "openrouter_fala": {
                                        "type": "string"
                                    },
                                    "openrouter_imagem": {
                                        "type": "string"
                                    },
                                    "vozes": {
                                        "type": "object",
                                        "description": "{ollama: {língua: voz}, openrouter: {língua: voz}}; línguas como «pt-PT» ou «en»."
                                    },
                                    "fala_linguas": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Línguas que o modelo local de fala serve (sem elas, a fala local não é usada)."
                                    },
                                    "ollama_ativo": {
                                        "type": "boolean"
                                    },
                                    "openrouter_ativo": {
                                        "type": "boolean"
                                    },
                                    "openrouter_dados": {
                                        "type": "boolean",
                                        "description": "Permite enviar dados de pacientes (incluindo a voz, nos usos de voz) ao serviço externo neste uso."
                                    }
                                },
                                "required": [
                                    "uso"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "rotulo": {
                                                    "type": "string"
                                                },
                                                "descricao": {
                                                    "type": "string"
                                                },
                                                "area": {
                                                    "type": "string"
                                                },
                                                "visao": {
                                                    "type": "boolean"
                                                },
                                                "texto": {
                                                    "type": "boolean"
                                                },
                                                "transcricao": {
                                                    "type": "boolean"
                                                },
                                                "fala": {
                                                    "type": "boolean"
                                                },
                                                "tipos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string",
                                                        "enum": [
                                                            "visao",
                                                            "texto",
                                                            "transcricao",
                                                            "fala"
                                                        ]
                                                    }
                                                },
                                                "campos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "ollama_visao": {
                                                    "type": "object"
                                                },
                                                "ollama_texto": {
                                                    "type": "object"
                                                },
                                                "ollama_transcricao": {
                                                    "type": "object"
                                                },
                                                "ollama_fala": {
                                                    "type": "object"
                                                },
                                                "openrouter_modelos": {
                                                    "type": "object"
                                                },
                                                "openrouter_transcricao": {
                                                    "type": "object"
                                                },
                                                "openrouter_fala": {
                                                    "type": "object"
                                                },
                                                "vozes": {
                                                    "type": [
                                                        "object",
                                                        "null"
                                                    ],
                                                    "description": "{ollama: {língua: voz}, openrouter: {língua: voz}}"
                                                },
                                                "fala_linguas": {
                                                    "type": [
                                                        "object",
                                                        "null"
                                                    ],
                                                    "description": "Línguas que o modelo local de fala serve: {definido, efetivo, origem, omissao}."
                                                },
                                                "linguas_voz": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "ollama_ativo": {
                                                    "type": "object"
                                                },
                                                "openrouter_ativo": {
                                                    "type": "object"
                                                },
                                                "openrouter_dados": {
                                                    "type": "object"
                                                },
                                                "configurado": {
                                                    "type": "boolean"
                                                },
                                                "configurado_tipos": {
                                                    "type": "object",
                                                    "additionalProperties": {
                                                        "type": "boolean"
                                                    }
                                                },
                                                "pode_editar": {
                                                    "type": "boolean"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/modelos-ia/ollama": {
            "get": {
                "tags": [
                    "Modelos de IA"
                ],
                "operationId": "modelosIaLocais",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Modelos instalados no serviço local",
                "parameters": [
                    {
                        "name": "renovar",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "enum": [
                                0,
                                1
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/modelos-ia/openrouter": {
            "get": {
                "tags": [
                    "Modelos de IA"
                ],
                "operationId": "modelosIaExternos",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Modelos disponíveis no serviço externo",
                "description": "Sem «tipo», os modelos de texto (preço por milhão de fichas, imagens); com tipo=transcricao ou tipo=fala, os modelos de áudio (com as vozes, quando o catálogo as indica); com tipo=imagem, os modelos com saída de imagem (output_modalities=image).",
                "parameters": [
                    {
                        "name": "q",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "limite",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "renovar",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "enum": [
                                0,
                                1
                            ]
                        }
                    },
                    {
                        "name": "tipo",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "transcricao",
                                "fala",
                                "imagem"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/modelos-ia/repor": {
            "post": {
                "tags": [
                    "Modelos de IA"
                ],
                "operationId": "modelosIaRepor",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Repor um campo no valor do servidor",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "uso": {
                                        "type": "string"
                                    },
                                    "campo": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "uso",
                                    "campo"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "string"
                                                },
                                                "rotulo": {
                                                    "type": "string"
                                                },
                                                "descricao": {
                                                    "type": "string"
                                                },
                                                "area": {
                                                    "type": "string"
                                                },
                                                "visao": {
                                                    "type": "boolean"
                                                },
                                                "texto": {
                                                    "type": "boolean"
                                                },
                                                "transcricao": {
                                                    "type": "boolean"
                                                },
                                                "fala": {
                                                    "type": "boolean"
                                                },
                                                "tipos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string",
                                                        "enum": [
                                                            "visao",
                                                            "texto",
                                                            "transcricao",
                                                            "fala"
                                                        ]
                                                    }
                                                },
                                                "campos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "ollama_visao": {
                                                    "type": "object"
                                                },
                                                "ollama_texto": {
                                                    "type": "object"
                                                },
                                                "ollama_transcricao": {
                                                    "type": "object"
                                                },
                                                "ollama_fala": {
                                                    "type": "object"
                                                },
                                                "openrouter_modelos": {
                                                    "type": "object"
                                                },
                                                "openrouter_transcricao": {
                                                    "type": "object"
                                                },
                                                "openrouter_fala": {
                                                    "type": "object"
                                                },
                                                "vozes": {
                                                    "type": [
                                                        "object",
                                                        "null"
                                                    ],
                                                    "description": "{ollama: {língua: voz}, openrouter: {língua: voz}}"
                                                },
                                                "fala_linguas": {
                                                    "type": [
                                                        "object",
                                                        "null"
                                                    ],
                                                    "description": "Línguas que o modelo local de fala serve: {definido, efetivo, origem, omissao}."
                                                },
                                                "linguas_voz": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "ollama_ativo": {
                                                    "type": "object"
                                                },
                                                "openrouter_ativo": {
                                                    "type": "object"
                                                },
                                                "openrouter_dados": {
                                                    "type": "object"
                                                },
                                                "configurado": {
                                                    "type": "boolean"
                                                },
                                                "configurado_tipos": {
                                                    "type": "object",
                                                    "additionalProperties": {
                                                        "type": "boolean"
                                                    }
                                                },
                                                "pode_editar": {
                                                    "type": "boolean"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/modelos-ia/testar": {
            "post": {
                "tags": [
                    "Modelos de IA"
                ],
                "operationId": "modelosIaTestar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Testar um modelo",
                "description": "Nos alvos de fala, diz a frase de teste na língua pedida (com a voz indicada ou a das Definições) e, havendo modelo de transcrição no uso, ouve-a de volta; nos de transcrição, ouve a frase dita pelo modelo de fala do uso; nos de imagem, gera um quadrado azul de 256 px. Os testes não levam dados de pacientes.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "uso": {
                                        "type": "string"
                                    },
                                    "alvo": {
                                        "type": "string",
                                        "enum": [
                                            "ollama_visao",
                                            "ollama_texto",
                                            "ollama_transcricao",
                                            "ollama_fala",
                                            "ollama_imagem",
                                            "openrouter",
                                            "openrouter_transcricao",
                                            "openrouter_fala",
                                            "openrouter_imagem"
                                        ]
                                    },
                                    "modelo": {
                                        "type": "string"
                                    },
                                    "lingua": {
                                        "type": "string"
                                    },
                                    "voz": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "uso",
                                    "alvo"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ok": {
                                                    "type": "boolean"
                                                },
                                                "alvo": {
                                                    "type": "string"
                                                },
                                                "modelo": {
                                                    "type": "string"
                                                },
                                                "duracao_ms": {
                                                    "type": "integer"
                                                },
                                                "resposta": {
                                                    "type": "string"
                                                },
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/modelos3d/incorporacoes": {
            "get": {
                "tags": [
                    "Visualizador 3D"
                ],
                "operationId": "listarIncorporacoes3d",
                "summary": "Códigos ativos da integração",
                "description": "Sem o código (só o hash fica guardado).",
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "modelo3d_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Incorporacao3d"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/modelos3d/incorporacoes/{id}": {
            "get": {
                "tags": [
                    "Visualizador 3D"
                ],
                "operationId": "obterIncorporacao3d",
                "summary": "Estado de um código (vistas, validade)",
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 33,
                        "description": "Identificador da incorporação"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Incorporacao3d"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            },
            "delete": {
                "tags": [
                    "Visualizador 3D"
                ],
                "operationId": "revogarIncorporacao3d",
                "summary": "Revogar o código",
                "description": "Revoga também a partilha temporária do modelo; a página passa a responder 410.",
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 33,
                        "description": "Identificador da incorporação"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Incorporacao3d"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/modelos3d/{id}/incorporacao": {
            "post": {
                "tags": [
                    "Visualizador 3D"
                ],
                "operationId": "criarIncorporacao3d",
                "summary": "Pedir o código de incorporação de um modelo 3D",
                "description": "Só clientes de integração (tokens da equipa e de pacientes recebem 403). As «origens» pedidas têm de estar entre as origens autorizadas da integração; sem «origens», valem todas as autorizadas. Sem origens autorizadas → 422.",
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 33,
                        "description": "Identificador do modelo 3D"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "minutos": {
                                        "type": "integer",
                                        "minimum": 5,
                                        "maximum": 240,
                                        "description": "Validade da ligação."
                                    },
                                    "sem_rosto": {
                                        "type": "boolean",
                                        "default": true,
                                        "description": "Retirar o rosto da malha mostrada."
                                    },
                                    "origens": {
                                        "type": "array",
                                        "items": {
                                            "type": "string",
                                            "format": "uri"
                                        },
                                        "description": "Subconjunto das origens autorizadas."
                                    },
                                    "referencia": {
                                        "type": "string",
                                        "maxLength": 120,
                                        "description": "Referência livre do seu sistema (sem dados pessoais)."
                                    }
                                }
                            },
                            "example": {
                                "minutos": 120,
                                "origens": [
                                    "https://parceiro.exemplo.com"
                                ],
                                "referencia": "consulta-remota-881"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Incorporacao3d"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 7,
                                        "modelo3d_id": 33,
                                        "url": "https://clinica.exemplo.pt/incorporar/m3d/3f1c…",
                                        "codigo_incorporacao": "<iframe src=\"https://clinica.exemplo.pt/incorporar/m3d/3f1c…\" title=\"Modelo 3D\" width=\"100%\" height=\"560\" loading=\"lazy\" referrerpolicy=\"no-referrer\" allow=\"fullscreen\" style=\"border:0;border-radius:16px\"></iframe>",
                                        "origens": [
                                            "https://parceiro.exemplo.com"
                                        ],
                                        "expira_em": "2026-10-29T16:30:00+00:00",
                                        "minutos": 120,
                                        "sem_rosto": true,
                                        "referencia": "consulta-remota-881"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    },
                    "503": {
                        "description": "Partilha de modelos 3D indisponível"
                    }
                }
            }
        },
        "/motor/afinacao": {
            "get": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "afinacaoMotor",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "ver",
                "summary": "Previsto vs real por zona e sugestões para os parâmetros",
                "parameters": [
                    {
                        "name": "de",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Desde"
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Até"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/motor/afinacao/aplicar": {
            "post": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "aplicarAfinacao",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "editar",
                "summary": "Aplicar sugestões ao rascunho dos parâmetros",
                "description": "Só sugestões com casos suficientes; escreve no rascunho mais recente. A versão em vigor só muda com a aprovação da direção clínica.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "chaves": {
                                        "type": "array",
                                        "items": {
                                            "type": "string",
                                            "enum": [
                                                "area_erro_pct",
                                                "sobrevivencia_couro_pct",
                                                "cabelos_por_uf"
                                            ]
                                        }
                                    },
                                    "de": {
                                        "type": "string"
                                    },
                                    "ate": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "chaves"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "versao_id": {
                                                    "type": "integer"
                                                },
                                                "aplicadas": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/motor/catalogo": {
            "get": {
                "tags": [
                    "Motor de cálculo"
                ],
                "operationId": "catalogoMotor",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "ver",
                "summary": "Catálogo dos parâmetros (secção 5)",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/motor/experimentar": {
            "post": {
                "tags": [
                    "Motor de cálculo"
                ],
                "operationId": "experimentarMotor",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "ver",
                "summary": "Exemplo da análise com uma versão",
                "description": "Com as sugestões iniciais dá 5 625 / 50 UF/cm² / 4 750 / 2 850 / 1 900 / −875.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "versao_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "versao_id": 1
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "versao": {
                                                    "type": "object"
                                                },
                                                "resultado": {
                                                    "$ref": "#/components/schemas/ResultadoMotor"
                                                },
                                                "resumo": {
                                                    "type": "object"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/motor/versoes": {
            "get": {
                "tags": [
                    "Motor de cálculo"
                ],
                "operationId": "listarVersoesMotor",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "ver",
                "summary": "Versões dos parâmetros",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/VersaoMotorLinha"
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "vigente_id": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                },
                                                "pode_aprovar": {
                                                    "type": "boolean"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            },
            "post": {
                "tags": [
                    "Motor de cálculo"
                ],
                "operationId": "novoRascunhoMotor",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "editar",
                "summary": "Novo rascunho",
                "description": "A partir de uma versão (base_id), da versão em vigor ou das sugestões iniciais da análise.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "base_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "notas": {
                                        "type": "string"
                                    }
                                }
                            },
                            "example": {
                                "base_id": 3
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/VersaoMotor"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/motor/versoes/{id}": {
            "get": {
                "tags": [
                    "Motor de cálculo"
                ],
                "operationId": "obterVersaoMotor",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "ver",
                "summary": "Versão completa (quadro, cenários, tabela zona × grau, diferenças)",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/VersaoMotor"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            },
            "put": {
                "tags": [
                    "Motor de cálculo"
                ],
                "operationId": "gravarVersaoMotor",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "editar",
                "summary": "Gravar o rascunho",
                "description": "Só rascunhos. A unidade de cada parâmetro é a do catálogo (outra → 422).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "parametros": {
                                        "type": "object"
                                    },
                                    "notas": {
                                        "type": "string"
                                    },
                                    "finalidade_regulamentar": {
                                        "type": "string"
                                    }
                                }
                            },
                            "example": {
                                "parametros": {
                                    "valores": {
                                        "dens_coroa": {
                                            "valor": 22
                                        }
                                    },
                                    "cenarios": {
                                        "agressivo": {
                                            "extracao_sessao_pct": 30
                                        }
                                    }
                                },
                                "finalidade_regulamentar": "Apoio ao médico…"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/VersaoMotor"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/motor/versoes/{id}/aprovar": {
            "post": {
                "tags": [
                    "Motor de cálculo"
                ],
                "operationId": "aprovarVersaoMotor",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "aprovar",
                "summary": "Aprovar (só direção clínica)",
                "description": "Exige médico com direcao_clinica = 1 e «aprovar» em clinico.parametros, e finalidade regulamentar escrita. A versão em vigor anterior fica arquivada. Efeitos: notificação aos médicos, webhook motor.versao_aprovada.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/VersaoMotor"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/motor/versoes/{id}/arquivar": {
            "post": {
                "tags": [
                    "Motor de cálculo"
                ],
                "operationId": "arquivarVersaoMotor",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "editar",
                "summary": "Arquivar",
                "description": "Retirar a versão em vigor exige a direção clínica.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/VersaoMotor"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/notificacoes": {
            "get": {
                "tags": [
                    "Sessão"
                ],
                "operationId": "notificacoes",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "paciente": []
                    }
                ],
                "summary": "Notificações",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "por_ler",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "enum": [
                                0,
                                1
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "integer"
                                                    },
                                                    "tipo": {
                                                        "type": "string"
                                                    },
                                                    "titulo": {
                                                        "type": "string"
                                                    },
                                                    "corpo": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "ligacao": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "lida": {
                                                        "type": "boolean"
                                                    },
                                                    "lida_em": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ],
                                                        "format": "date-time"
                                                    },
                                                    "criado_em": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ],
                                                        "format": "date-time"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "pagina": {
                                                    "type": "integer"
                                                },
                                                "por_pagina": {
                                                    "type": "integer"
                                                },
                                                "total": {
                                                    "type": "integer"
                                                },
                                                "por_ler": {
                                                    "type": "integer"
                                                },
                                                "nao_lidas": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    }
                }
            }
        },
        "/notificacoes/lidas": {
            "post": {
                "tags": [
                    "Sessão"
                ],
                "operationId": "marcarTodasLidas",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "paciente": []
                    }
                ],
                "summary": "Marcar todas como lidas",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "marcadas": {
                                                    "type": "integer"
                                                },
                                                "por_ler": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    }
                }
            }
        },
        "/notificacoes/preferencias": {
            "get": {
                "tags": [
                    "Avisos no telemóvel"
                ],
                "operationId": "notificacoesPreferencias",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "paciente": []
                    }
                ],
                "summary": "Preferências por categoria",
                "description": "Equipa: mensagens, agenda, tarefas, documentos, pagamentos, alertas, geral. Pacientes: mensagens, agenda, documentos, pagamentos, geral. Sem escolha = ligado.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "chave": {
                                                        "type": "string",
                                                        "enum": [
                                                            "mensagens",
                                                            "agenda",
                                                            "tarefas",
                                                            "documentos",
                                                            "pagamentos",
                                                            "alertas",
                                                            "geral"
                                                        ]
                                                    },
                                                    "rotulo": {
                                                        "type": "string"
                                                    },
                                                    "descricao": {
                                                        "type": "string"
                                                    },
                                                    "push": {
                                                        "type": "boolean"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "chave": "mensagens",
                                            "rotulo": "Mensagens",
                                            "descricao": "Mensagens de pacientes e da equipa, menções e comunicados.",
                                            "push": true
                                        },
                                        {
                                            "chave": "agenda",
                                            "rotulo": "Agenda e marcações",
                                            "descricao": "Marcações, teleconsultas, bloco operatório e reuniões.",
                                            "push": false
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            },
            "put": {
                "tags": [
                    "Avisos no telemóvel"
                ],
                "operationId": "notificacoesPreferenciasGravar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "paciente": []
                    }
                ],
                "summary": "Gravar preferências",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "categorias": {
                                        "type": "object",
                                        "additionalProperties": {
                                            "type": "boolean"
                                        }
                                    },
                                    "categoria": {
                                        "type": "string"
                                    },
                                    "push": {
                                        "type": "boolean"
                                    }
                                }
                            },
                            "example": {
                                "categorias": {
                                    "agenda": false,
                                    "mensagens": true
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "chave": {
                                                        "type": "string",
                                                        "enum": [
                                                            "mensagens",
                                                            "agenda",
                                                            "tarefas",
                                                            "documentos",
                                                            "pagamentos",
                                                            "alertas",
                                                            "geral"
                                                        ]
                                                    },
                                                    "rotulo": {
                                                        "type": "string"
                                                    },
                                                    "descricao": {
                                                        "type": "string"
                                                    },
                                                    "push": {
                                                        "type": "boolean"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "chave": "mensagens",
                                            "rotulo": "Mensagens",
                                            "descricao": "Mensagens de pacientes e da equipa, menções e comunicados.",
                                            "push": true
                                        },
                                        {
                                            "chave": "agenda",
                                            "rotulo": "Agenda e marcações",
                                            "descricao": "Marcações, teleconsultas, bloco operatório e reuniões.",
                                            "push": false
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/notificacoes/{id}/lida": {
            "post": {
                "tags": [
                    "Sessão"
                ],
                "operationId": "marcarNotificacaoLida",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "paciente": []
                    }
                ],
                "summary": "Marcar como lida",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "por_ler": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/oauth/token": {
            "post": {
                "tags": [
                    "Integrações"
                ],
                "operationId": "tokenIntegracao",
                "security": [],
                "summary": "Token de integração (client credentials)",
                "description": "RFC 6749 §4.4. Credenciais no corpo (client_id, client_secret) ou em HTTP Basic. Resposta OAuth padrão FORA do envelope. O token vale 1 hora; não há renovação: peça outro. Âmbitos com conteúdo clínico só são concedidos depois de a justificação clínica do cliente ser aprovada.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/x-www-form-urlencoded": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "grant_type"
                                ],
                                "properties": {
                                    "grant_type": {
                                        "const": "client_credentials"
                                    },
                                    "client_id": {
                                        "type": "string"
                                    },
                                    "client_secret": {
                                        "type": "string"
                                    },
                                    "scope": {
                                        "type": "string",
                                        "description": "Âmbitos separados por espaços (subconjunto dos concedidos)."
                                    }
                                }
                            }
                        },
                        "application/json": {
                            "schema": {
                                "type": "object"
                            },
                            "example": {
                                "grant_type": "client_credentials",
                                "client_id": "ax_4f1d0c9b2e7a6f3d8c5b1a20",
                                "client_secret": "…",
                                "scope": "agenda:ver crm.leads:editar"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Token emitido",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "access_token": {
                                            "type": "string"
                                        },
                                        "token_type": {
                                            "const": "Bearer"
                                        },
                                        "expires_in": {
                                            "type": "integer"
                                        },
                                        "scope": {
                                            "type": "string"
                                        }
                                    }
                                },
                                "example": {
                                    "access_token": "ax_i_…",
                                    "token_type": "Bearer",
                                    "expires_in": 3600,
                                    "scope": "agenda:ver crm.leads:editar"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "invalid_request | unsupported_grant_type | invalid_scope",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "error": {
                                            "type": "string"
                                        },
                                        "error_description": {
                                            "type": "string"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "invalid_client (credenciais erradas, cliente inativo ou expirado, endereço não permitido)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "error": {
                                            "type": "string"
                                        },
                                        "error_description": {
                                            "type": "string"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/opcoes/academia_certificados": {
            "get": {
                "tags": [
                    "Recurso: Certificados"
                ],
                "operationId": "opcoesAcademiaCertificados",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "academia_certificados"
            }
        },
        "/opcoes/academia_cursos": {
            "get": {
                "tags": [
                    "Recurso: Cursos da academia"
                ],
                "operationId": "opcoesAcademiaCursos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "academia_cursos"
            }
        },
        "/opcoes/academia_licoes": {
            "get": {
                "tags": [
                    "Recurso: Lições"
                ],
                "operationId": "opcoesAcademiaLicoes",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "academia_licoes"
            }
        },
        "/opcoes/academia_percursos": {
            "get": {
                "tags": [
                    "Recurso: Percursos de formação"
                ],
                "operationId": "opcoesAcademiaPercursos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "academia_percursos"
            }
        },
        "/opcoes/academia_perguntas": {
            "get": {
                "tags": [
                    "Recurso: Perguntas dos testes"
                ],
                "operationId": "opcoesAcademiaPerguntas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "academia_perguntas"
            }
        },
        "/opcoes/acessos_emergencia": {
            "get": {
                "tags": [
                    "Recurso: Acessos de emergência"
                ],
                "operationId": "opcoesAcessosEmergencia",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.auditoria:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "acessos_emergencia"
            }
        },
        "/opcoes/agente_pedidos": {
            "get": {
                "tags": [
                    "Recurso: Pedidos do agente"
                ],
                "operationId": "opcoesAgentePedidos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "agente_pedidos"
            }
        },
        "/opcoes/agente_testes": {
            "get": {
                "tags": [
                    "Recurso: Conversas de teste"
                ],
                "operationId": "opcoesAgenteTestes",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "agente_testes"
            }
        },
        "/opcoes/alertas_acesso": {
            "get": {
                "tags": [
                    "Recurso: Alertas de acesso"
                ],
                "operationId": "opcoesAlertasAcesso",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.auditoria:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "alertas_acesso"
            }
        },
        "/opcoes/api_clientes": {
            "get": {
                "tags": [
                    "Recurso: Clientes de integração"
                ],
                "operationId": "opcoesApiClientes",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "api_clientes"
            }
        },
        "/opcoes/artigos": {
            "get": {
                "tags": [
                    "Recurso: Artigos"
                ],
                "operationId": "opcoesArtigos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "artigos"
            }
        },
        "/opcoes/artigos_precos": {
            "get": {
                "tags": [
                    "Recurso: Preços de fornecedor"
                ],
                "operationId": "opcoesArtigosPrecos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "artigos_precos"
            }
        },
        "/opcoes/atividades_tratamento": {
            "get": {
                "tags": [
                    "Recurso: Registo das atividades de tratamento"
                ],
                "operationId": "opcoesAtividadesTratamento",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "atividades_tratamento"
            }
        },
        "/opcoes/ausencias": {
            "get": {
                "tags": [
                    "Recurso: Ausências e férias"
                ],
                "operationId": "opcoesAusencias",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "ausencias"
            }
        },
        "/opcoes/avisos_exibicoes": {
            "get": {
                "tags": [
                    "Recurso: Avisos mostrados"
                ],
                "operationId": "opcoesAvisosExibicoes",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "avisos_exibicoes"
            }
        },
        "/opcoes/avisos_privacidade": {
            "get": {
                "tags": [
                    "Recurso: Avisos de privacidade"
                ],
                "operationId": "opcoesAvisosPrivacidade",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "avisos_privacidade"
            }
        },
        "/opcoes/base_conhecimento": {
            "get": {
                "tags": [
                    "Recurso: Base de conhecimento"
                ],
                "operationId": "opcoesBaseConhecimento",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "base_conhecimento"
            }
        },
        "/opcoes/caixas": {
            "get": {
                "tags": [
                    "Recurso: Caixas"
                ],
                "operationId": "opcoesCaixas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "caixas"
            }
        },
        "/opcoes/campanhas": {
            "get": {
                "tags": [
                    "Recurso: Campanhas"
                ],
                "operationId": "opcoesCampanhas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "campanhas"
            }
        },
        "/opcoes/campanhas_chamadas": {
            "get": {
                "tags": [
                    "Recurso: Listas de chamadas"
                ],
                "operationId": "opcoesCampanhasChamadas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "campanhas_chamadas"
            }
        },
        "/opcoes/capturas": {
            "get": {
                "tags": [
                    "Recurso: Capturas"
                ],
                "operationId": "opcoesCapturas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "capturas"
            }
        },
        "/opcoes/casos_publicados": {
            "get": {
                "tags": [
                    "Recurso: Casos publicados"
                ],
                "operationId": "opcoesCasosPublicados",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "site.cms:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "casos_publicados"
            }
        },
        "/opcoes/chamadas": {
            "get": {
                "tags": [
                    "Recurso: Chamadas"
                ],
                "operationId": "opcoesChamadas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "chamadas"
            }
        },
        "/opcoes/checklist_modelos": {
            "get": {
                "tags": [
                    "Recurso: Checklists de segurança"
                ],
                "operationId": "opcoesChecklistModelos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "bloco.registo:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "checklist_modelos"
            }
        },
        "/opcoes/cirurgias": {
            "get": {
                "tags": [
                    "Recurso: Cirurgias"
                ],
                "operationId": "opcoesCirurgias",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "bloco.mapa:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "bloco.mapa",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "cirurgias"
            }
        },
        "/opcoes/clinicas": {
            "get": {
                "tags": [
                    "Recurso: Clínicas"
                ],
                "operationId": "opcoesClinicas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "clinicas"
            }
        },
        "/opcoes/cms_blocos": {
            "get": {
                "tags": [
                    "Recurso: Blocos do site"
                ],
                "operationId": "opcoesCmsBlocos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "site.cms:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "cms_blocos"
            }
        },
        "/opcoes/cms_paginas": {
            "get": {
                "tags": [
                    "Recurso: Páginas do site"
                ],
                "operationId": "opcoesCmsPaginas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "site.cms:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "cms_paginas"
            }
        },
        "/opcoes/codigos_desconto": {
            "get": {
                "tags": [
                    "Recurso: Códigos de desconto"
                ],
                "operationId": "opcoesCodigosDesconto",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.descontos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "comercial.descontos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "codigos_desconto"
            }
        },
        "/opcoes/comissoes": {
            "get": {
                "tags": [
                    "Recurso: Comissões"
                ],
                "operationId": "opcoesComissoes",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "comissoes"
            }
        },
        "/opcoes/comissoes_regras": {
            "get": {
                "tags": [
                    "Recurso: Regras de comissões"
                ],
                "operationId": "opcoesComissoesRegras",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "comissoes_regras"
            }
        },
        "/opcoes/complicacoes": {
            "get": {
                "tags": [
                    "Recurso: Complicações"
                ],
                "operationId": "opcoesComplicacoes",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "complicacoes"
            }
        },
        "/opcoes/comunicados": {
            "get": {
                "tags": [
                    "Recurso: Comunicados"
                ],
                "operationId": "opcoesComunicados",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "comunicados"
            }
        },
        "/opcoes/consentimento_modelos": {
            "get": {
                "tags": [
                    "Recurso: Modelos de consentimento"
                ],
                "operationId": "opcoesConsentimentoModelos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "consentimento_modelos"
            }
        },
        "/opcoes/consentimentos": {
            "get": {
                "tags": [
                    "Recurso: Registo de consentimentos"
                ],
                "operationId": "opcoesConsentimentos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.consentimentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.consentimentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "consentimentos"
            }
        },
        "/opcoes/conservacao_regras": {
            "get": {
                "tags": [
                    "Recurso: Prazos de conservação"
                ],
                "operationId": "opcoesConservacaoRegras",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "conservacao_regras"
            }
        },
        "/opcoes/consultas": {
            "get": {
                "tags": [
                    "Recurso: Consultas"
                ],
                "operationId": "opcoesConsultas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "consultas"
            }
        },
        "/opcoes/contas_pagadoras": {
            "get": {
                "tags": [
                    "Recurso: Contas pagadoras"
                ],
                "operationId": "opcoesContasPagadoras",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "contas_pagadoras"
            }
        },
        "/opcoes/contas_subcontas": {
            "get": {
                "tags": [
                    "Recurso: Subcontas"
                ],
                "operationId": "opcoesContasSubcontas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "contas_subcontas"
            }
        },
        "/opcoes/convencoes": {
            "get": {
                "tags": [
                    "Recurso: Convenções"
                ],
                "operationId": "opcoesConvencoes",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "convencoes"
            }
        },
        "/opcoes/convencoes_atos": {
            "get": {
                "tags": [
                    "Recurso: Atos da convenção"
                ],
                "operationId": "opcoesConvencoesAtos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "convencoes_atos"
            }
        },
        "/opcoes/conversas": {
            "get": {
                "tags": [
                    "Recurso: Conversas"
                ],
                "operationId": "opcoesConversas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "conversas"
            }
        },
        "/opcoes/cuidados_conteudos": {
            "get": {
                "tags": [
                    "Recurso: Cuidados por fase"
                ],
                "operationId": "opcoesCuidadosConteudos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "cuidados_conteudos"
            }
        },
        "/opcoes/custos_anuncios": {
            "get": {
                "tags": [
                    "Recurso: Custos de anúncios"
                ],
                "operationId": "opcoesCustosAnuncios",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "custos_anuncios"
            }
        },
        "/opcoes/datas_especiais": {
            "get": {
                "tags": [
                    "Recurso: Datas especiais"
                ],
                "operationId": "opcoesDatasEspeciais",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "datas_especiais"
            }
        },
        "/opcoes/delegacoes": {
            "get": {
                "tags": [
                    "Recurso: Delegações"
                ],
                "operationId": "opcoesDelegacoes",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "delegacoes"
            }
        },
        "/opcoes/diagnosticos_apoio": {
            "get": {
                "tags": [
                    "Recurso: Diagnósticos de apoio"
                ],
                "operationId": "opcoesDiagnosticosApoio",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "diagnosticos_apoio"
            }
        },
        "/opcoes/documento_modelos": {
            "get": {
                "tags": [
                    "Recurso: Modelos de documento"
                ],
                "operationId": "opcoesDocumentoModelos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "documento_modelos"
            }
        },
        "/opcoes/documentos": {
            "get": {
                "tags": [
                    "Recurso: Documentos emitidos"
                ],
                "operationId": "opcoesDocumentos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "documentos"
            }
        },
        "/opcoes/documentos_fiscais": {
            "get": {
                "tags": [
                    "Recurso: Documentos fiscais"
                ],
                "operationId": "opcoesDocumentosFiscais",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "documentos_fiscais"
            }
        },
        "/opcoes/encomendas": {
            "get": {
                "tags": [
                    "Recurso: Encomendas"
                ],
                "operationId": "opcoesEncomendas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "encomendas"
            }
        },
        "/opcoes/episodios": {
            "get": {
                "tags": [
                    "Recurso: Episódios"
                ],
                "operationId": "opcoesEpisodios",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "episodios"
            }
        },
        "/opcoes/episodios_equipa": {
            "get": {
                "tags": [
                    "Recurso: Equipa dos episódios"
                ],
                "operationId": "opcoesEpisodiosEquipa",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "episodios_equipa"
            }
        },
        "/opcoes/equipamentos": {
            "get": {
                "tags": [
                    "Recurso: Equipamentos"
                ],
                "operationId": "opcoesEquipamentos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "equipamentos"
            }
        },
        "/opcoes/equipamentos_registos": {
            "get": {
                "tags": [
                    "Recurso: Manutenções e registos"
                ],
                "operationId": "opcoesEquipamentosRegistos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "equipamentos_registos"
            }
        },
        "/opcoes/equipas": {
            "get": {
                "tags": [
                    "Recurso: Equipas"
                ],
                "operationId": "opcoesEquipas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "equipas"
            }
        },
        "/opcoes/feriados": {
            "get": {
                "tags": [
                    "Recurso: Feriados"
                ],
                "operationId": "opcoesFeriados",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "feriados"
            }
        },
        "/opcoes/formacoes": {
            "get": {
                "tags": [
                    "Recurso: Formação da equipa"
                ],
                "operationId": "opcoesFormacoes",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "formacoes"
            }
        },
        "/opcoes/formularios": {
            "get": {
                "tags": [
                    "Recurso: Formulários"
                ],
                "operationId": "opcoesFormularios",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "formularios"
            }
        },
        "/opcoes/formularios_respostas": {
            "get": {
                "tags": [
                    "Recurso: Respostas a formulários"
                ],
                "operationId": "opcoesFormulariosRespostas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "formularios_respostas"
            }
        },
        "/opcoes/fotos": {
            "get": {
                "tags": [
                    "Recurso: Fotografias"
                ],
                "operationId": "opcoesFotos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "fotos"
            }
        },
        "/opcoes/funil_fases": {
            "get": {
                "tags": [
                    "Recurso: Fases do funil"
                ],
                "operationId": "opcoesFunilFases",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "funil_fases"
            }
        },
        "/opcoes/funis": {
            "get": {
                "tags": [
                    "Recurso: Funis por mercado"
                ],
                "operationId": "opcoesFunis",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "funis"
            }
        },
        "/opcoes/guioes": {
            "get": {
                "tags": [
                    "Recurso: Guiões"
                ],
                "operationId": "opcoesGuioes",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "guioes"
            }
        },
        "/opcoes/honorarios": {
            "get": {
                "tags": [
                    "Recurso: Honorários"
                ],
                "operationId": "opcoesHonorarios",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "honorarios"
            }
        },
        "/opcoes/horarios": {
            "get": {
                "tags": [
                    "Recurso: Horários"
                ],
                "operationId": "opcoesHorarios",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "horarios"
            }
        },
        "/opcoes/ia_pedidos": {
            "get": {
                "tags": [
                    "Recurso: Pedidos de IA"
                ],
                "operationId": "opcoesIaPedidos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "ia_pedidos"
            }
        },
        "/opcoes/ia_propostas": {
            "get": {
                "tags": [
                    "Recurso: Propostas da IA"
                ],
                "operationId": "opcoesIaPropostas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "ia_propostas"
            }
        },
        "/opcoes/imagens_marketing": {
            "get": {
                "tags": [
                    "Recurso: Biblioteca de imagens"
                ],
                "operationId": "opcoesImagensMarketing",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "imagens_marketing"
            }
        },
        "/opcoes/importacoes": {
            "get": {
                "tags": [
                    "Recurso: Importações"
                ],
                "operationId": "opcoesImportacoes",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "importacoes"
            }
        },
        "/opcoes/incidentes_seguranca": {
            "get": {
                "tags": [
                    "Recurso: Incidentes de segurança"
                ],
                "operationId": "opcoesIncidentesSeguranca",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "incidentes_seguranca"
            }
        },
        "/opcoes/itinerarios": {
            "get": {
                "tags": [
                    "Recurso: Itinerários"
                ],
                "operationId": "opcoesItinerarios",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "itinerarios"
            }
        },
        "/opcoes/leads": {
            "get": {
                "tags": [
                    "Recurso: Leads"
                ],
                "operationId": "opcoesLeads",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "leads"
            }
        },
        "/opcoes/lista_espera": {
            "get": {
                "tags": [
                    "Recurso: Lista de espera"
                ],
                "operationId": "opcoesListaEspera",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "lista_espera"
            }
        },
        "/opcoes/locais": {
            "get": {
                "tags": [
                    "Recurso: Locais"
                ],
                "operationId": "opcoesLocais",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "locais"
            }
        },
        "/opcoes/marcacao_tipos": {
            "get": {
                "tags": [
                    "Recurso: Tipos de marcação"
                ],
                "operationId": "opcoesMarcacaoTipos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "marcacao_tipos"
            }
        },
        "/opcoes/marcacoes": {
            "get": {
                "tags": [
                    "Recurso: Marcações"
                ],
                "operationId": "opcoesMarcacoes",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "marcacoes"
            }
        },
        "/opcoes/marcos_acompanhamento": {
            "get": {
                "tags": [
                    "Recurso: Marcos de acompanhamento"
                ],
                "operationId": "opcoesMarcosAcompanhamento",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "marcos_acompanhamento"
            }
        },
        "/opcoes/modelos3d": {
            "get": {
                "tags": [
                    "Recurso: Modelos 3D"
                ],
                "operationId": "opcoesModelos3d",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "modelos3d"
            }
        },
        "/opcoes/motor_versoes": {
            "get": {
                "tags": [
                    "Recurso: Versões do motor"
                ],
                "operationId": "opcoesMotorVersoes",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "motor_versoes"
            }
        },
        "/opcoes/objetivos_comerciais": {
            "get": {
                "tags": [
                    "Recurso: Objetivos comerciais"
                ],
                "operationId": "opcoesObjetivosComerciais",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "objetivos_comerciais"
            }
        },
        "/opcoes/pacientes": {
            "get": {
                "tags": [
                    "Recurso: Pacientes"
                ],
                "operationId": "opcoesPacientes",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "pacientes"
            }
        },
        "/opcoes/pacientes_alertas": {
            "get": {
                "tags": [
                    "Recurso: Alertas clínicos"
                ],
                "operationId": "opcoesPacientesAlertas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "pacientes_alertas"
            }
        },
        "/opcoes/pagamentos": {
            "get": {
                "tags": [
                    "Recurso: Pagamentos"
                ],
                "operationId": "opcoesPagamentos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "pagamentos"
            }
        },
        "/opcoes/parceiros": {
            "get": {
                "tags": [
                    "Recurso: Parceiros"
                ],
                "operationId": "opcoesParceiros",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "parceiros"
            }
        },
        "/opcoes/parceiros_encaminhamentos": {
            "get": {
                "tags": [
                    "Recurso: Encaminhamentos de parceiros"
                ],
                "operationId": "opcoesParceirosEncaminhamentos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "parceiros_encaminhamentos"
            }
        },
        "/opcoes/pedidos_titulares": {
            "get": {
                "tags": [
                    "Recurso: Pedidos dos titulares"
                ],
                "operationId": "opcoesPedidosTitulares",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "pedidos_titulares"
            }
        },
        "/opcoes/perfis": {
            "get": {
                "tags": [
                    "Recurso: Perfis"
                ],
                "operationId": "opcoesPerfis",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "perfis"
            }
        },
        "/opcoes/planos": {
            "get": {
                "tags": [
                    "Recurso: Planos cirúrgicos"
                ],
                "operationId": "opcoesPlanos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "planos"
            }
        },
        "/opcoes/portal_contas": {
            "get": {
                "tags": [
                    "Recurso: Contas do portal"
                ],
                "operationId": "opcoesPortalContas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "portal_contas"
            }
        },
        "/opcoes/portal_pedidos": {
            "get": {
                "tags": [
                    "Recurso: Pedidos do portal"
                ],
                "operationId": "opcoesPortalPedidos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "portal_pedidos"
            }
        },
        "/opcoes/pre_avaliacoes": {
            "get": {
                "tags": [
                    "Recurso: Pré-avaliações"
                ],
                "operationId": "opcoesPreAvaliacoes",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "pre_avaliacoes"
            }
        },
        "/opcoes/procedimentos": {
            "get": {
                "tags": [
                    "Recurso: Procedimentos"
                ],
                "operationId": "opcoesProcedimentos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "procedimentos"
            }
        },
        "/opcoes/propostas": {
            "get": {
                "tags": [
                    "Recurso: Propostas"
                ],
                "operationId": "opcoesPropostas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "propostas"
            }
        },
        "/opcoes/protocolos_foto": {
            "get": {
                "tags": [
                    "Recurso: Protocolos fotográficos"
                ],
                "operationId": "opcoesProtocolosFoto",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "protocolos_foto"
            }
        },
        "/opcoes/publicos_anuncios": {
            "get": {
                "tags": [
                    "Recurso: Públicos para anúncios"
                ],
                "operationId": "opcoesPublicosAnuncios",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "publicos_anuncios"
            }
        },
        "/opcoes/reclamacoes": {
            "get": {
                "tags": [
                    "Recurso: Reclamações, elogios e sugestões"
                ],
                "operationId": "opcoesReclamacoes",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "reclamacoes"
            }
        },
        "/opcoes/recursos_agenda": {
            "get": {
                "tags": [
                    "Recurso: Salas, equipamentos e intérpretes"
                ],
                "operationId": "opcoesRecursosAgenda",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "recursos_agenda"
            }
        },
        "/opcoes/regras_elegibilidade": {
            "get": {
                "tags": [
                    "Recurso: Regras de elegibilidade"
                ],
                "operationId": "opcoesRegrasElegibilidade",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "regras_elegibilidade"
            }
        },
        "/opcoes/relatorios_agendados": {
            "get": {
                "tags": [
                    "Recurso: Relatórios agendados"
                ],
                "operationId": "opcoesRelatoriosAgendados",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "relatorios_agendados"
            }
        },
        "/opcoes/respostas_rapidas": {
            "get": {
                "tags": [
                    "Recurso: Respostas rápidas"
                ],
                "operationId": "opcoesRespostasRapidas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "respostas_rapidas"
            }
        },
        "/opcoes/reunioes": {
            "get": {
                "tags": [
                    "Recurso: Reuniões"
                ],
                "operationId": "opcoesReunioes",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "reunioes"
            }
        },
        "/opcoes/revisoes_acessos": {
            "get": {
                "tags": [
                    "Recurso: Revisões de acessos"
                ],
                "operationId": "opcoesRevisoesAcessos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "revisoes_acessos"
            }
        },
        "/opcoes/segmentos": {
            "get": {
                "tags": [
                    "Recurso: Segmentos"
                ],
                "operationId": "opcoesSegmentos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "segmentos"
            }
        },
        "/opcoes/sequencias": {
            "get": {
                "tags": [
                    "Recurso: Sequências"
                ],
                "operationId": "opcoesSequencias",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "sequencias"
            }
        },
        "/opcoes/stock_movimentos": {
            "get": {
                "tags": [
                    "Recurso: Movimentos de stock"
                ],
                "operationId": "opcoesStockMovimentos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "stock_movimentos"
            }
        },
        "/opcoes/subcontratantes": {
            "get": {
                "tags": [
                    "Recurso: Subcontratantes"
                ],
                "operationId": "opcoesSubcontratantes",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "subcontratantes"
            }
        },
        "/opcoes/supressoes": {
            "get": {
                "tags": [
                    "Recurso: Oposição a contactos"
                ],
                "operationId": "opcoesSupressoes",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "supressoes"
            }
        },
        "/opcoes/tabelas_precos": {
            "get": {
                "tags": [
                    "Recurso: Tabelas de preços"
                ],
                "operationId": "opcoesTabelasPrecos",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "tabelas_precos"
            }
        },
        "/opcoes/tarefas": {
            "get": {
                "tags": [
                    "Recurso: Tarefas"
                ],
                "operationId": "opcoesTarefas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.tarefas:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "tarefas"
            }
        },
        "/opcoes/teleconsultas": {
            "get": {
                "tags": [
                    "Recurso: Teleconsultas"
                ],
                "operationId": "opcoesTeleconsultas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "teleconsulta:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "teleconsultas"
            }
        },
        "/opcoes/telefonia_extensoes": {
            "get": {
                "tags": [
                    "Recurso: Extensões"
                ],
                "operationId": "opcoesTelefoniaExtensoes",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "telefonia_extensoes"
            }
        },
        "/opcoes/telefonia_numeros": {
            "get": {
                "tags": [
                    "Recurso: Números da clínica"
                ],
                "operationId": "opcoesTelefoniaNumeros",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "telefonia_numeros"
            }
        },
        "/opcoes/terminais_pagamento": {
            "get": {
                "tags": [
                    "Recurso: Terminais de pagamento"
                ],
                "operationId": "opcoesTerminaisPagamento",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "terminais_pagamento"
            }
        },
        "/opcoes/tratamentos_complementares": {
            "get": {
                "tags": [
                    "Recurso: Tratamentos complementares"
                ],
                "operationId": "opcoesTratamentosComplementares",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "tratamentos_complementares"
            }
        },
        "/opcoes/tricoscopias": {
            "get": {
                "tags": [
                    "Recurso: Campos de tricoscopia"
                ],
                "operationId": "opcoesTricoscopias",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "tricoscopias"
            }
        },
        "/opcoes/utilizadores": {
            "get": {
                "tags": [
                    "Recurso: Utilizadores"
                ],
                "operationId": "opcoesUtilizadores",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "utilizadores"
            }
        },
        "/opcoes/vales": {
            "get": {
                "tags": [
                    "Recurso: Vales de oferta"
                ],
                "operationId": "opcoesVales",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "vales"
            }
        },
        "/opcoes/voz_gravacoes": {
            "get": {
                "tags": [
                    "Recurso: Mensagens gravadas"
                ],
                "operationId": "opcoesVozGravacoes",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "voz_gravacoes"
            }
        },
        "/opcoes/voz_menus": {
            "get": {
                "tags": [
                    "Recurso: Menus de voz"
                ],
                "operationId": "opcoesVozMenus",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "voz_menus"
            }
        },
        "/opcoes/webhooks": {
            "get": {
                "tags": [
                    "Recurso: Webhooks"
                ],
                "operationId": "opcoesWebhooks",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "webhooks"
            }
        },
        "/opcoes/webhooks_entregas": {
            "get": {
                "tags": [
                    "Recurso: Entregas de webhooks"
                ],
                "operationId": "opcoesWebhooksEntregas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "webhooks_entregas"
            }
        },
        "/opcoes/whatsapp_linhas": {
            "get": {
                "tags": [
                    "Recurso: Linhas de WhatsApp"
                ],
                "operationId": "opcoesWhatsappLinhas",
                "summary": "Opções para seleção (id, rótulo)",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "1,2"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Opcao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "whatsapp_linhas"
            }
        },
        "/openapi.json": {
            "get": {
                "tags": [
                    "Integrações"
                ],
                "operationId": "especificacaoJson",
                "security": [],
                "summary": "Especificação OpenAPI 3.1 (JSON)",
                "parameters": [
                    {
                        "name": "lingua",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "pt",
                                "en"
                            ]
                        }
                    },
                    {
                        "name": "descarregar",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "enum": [
                                0,
                                1
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Documento OpenAPI",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/openapi.yaml": {
            "get": {
                "tags": [
                    "Integrações"
                ],
                "operationId": "especificacaoYaml",
                "security": [],
                "summary": "Especificação OpenAPI 3.1 (YAML)",
                "parameters": [
                    {
                        "name": "lingua",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "pt",
                                "en"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Documento OpenAPI",
                        "content": {
                            "application/yaml": {
                                "schema": {
                                    "type": "string"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/pacientes/duplicados": {
            "post": {
                "tags": [
                    "Ficha do paciente"
                ],
                "operationId": "m1VerificarDuplicados",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:ver"
                        ]
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "ver",
                "summary": "Possíveis duplicados de dados ainda por gravar",
                "description": "A rota não tem permissão própria: o controlador exige «ver» em ficha.identificacao OU em crm.leads (o comercial verifica antes de converter um lead). Equipa e integrações. Mesmos critérios e saída de GET /pacientes/{id}/duplicados; excluir_id retira um paciente da comparação. Não grava nada. Limite (por omissão): 120 pedidos por minuto por token da equipa; nas integrações vale o limite por minuto definido no cliente de integração (429 com Retry-After).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "nome": {
                                        "type": "string"
                                    },
                                    "apelidos": {
                                        "type": "string"
                                    },
                                    "nome_completo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "description": "Usado em vez de nome + apelidos quando enviado."
                                    },
                                    "email": {
                                        "type": "string"
                                    },
                                    "telefone": {
                                        "type": "string",
                                        "description": "Compara os últimos 9 algarismos."
                                    },
                                    "nif": {
                                        "type": "string",
                                        "description": "Comparado por índice cego (6 ou mais algarismos)."
                                    },
                                    "data_nascimento": {
                                        "type": "string"
                                    },
                                    "excluir_id": {
                                        "type": "integer"
                                    }
                                }
                            },
                            "example": {
                                "nome": "Rui",
                                "apelidos": "Almeida",
                                "email": "rui.almeida@exemplo.pt",
                                "telefone": "912 345 678",
                                "data_nascimento": "1988-04-12"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/M1Duplicado"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/pacientes/importar": {
            "post": {
                "tags": [
                    "Ficha do paciente"
                ],
                "operationId": "m1ImportarPacientes",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "editar",
                "summary": "Importar fichas de pacientes (CSV)",
                "description": "Dois passos: gravar = 0 pré-visualiza (cada linha validada e comparada com os pacientes existentes), gravar = 1 importa. Ficheiro .csv ou .txt de texto, até 5 MB e 5000 linhas, separador «;», «,» ou tabulação (detetado), UTF-8 ou Latin-1 (cp1252, convertido); lido e descartado, nunca guardado. Cabeçalhos aceites, sem acentos nem maiúsculas e com sinónimos: nome, apelidos, nome completo, email, telefone, telefone alternativo, data de nascimento, sexo, nif, morada, codigo postal, localidade, pais, nacionalidade, idioma, profissao, cliente desde, notas, numero anterior (vai para as notas). É obrigatória uma coluna de nome. Duplicados fortes ficam de fora; linhas inválidas ficam em «erro» com as mensagens. Efeitos ao importar: pacientes com o número da clínica e origem «importacao», linha do tempo e webhook paciente.criado por paciente, auditoria. Histórico (acréscimo compatível, campo «tipo»): pacientes (omissão), consultas, alertas ou episodios. Cada linha de histórico identifica o paciente por uma coluna: numero paciente (processo atual), numero anterior (o número do sistema antigo registado na importação dos pacientes), nif, email ou nome completo + data de nascimento (só com um candidato forte). Consultas (coluna data obrigatória; tipo, motivo, antecedentes, medicacao, alergias, habitos, historia familiar, expectativas, exame, diagnostico, diagnostico diferencial, notas, escala, grau, tecnica, area): exigem ficha.clinica editar e o paciente no âmbito clínico; entram FECHADAS (estado «assinada», origem «importacao», impressão digital, aditamento com a proveniência); duplicado = mesmo paciente, dia e tipo. Alertas (descricao obrigatória; tipo, gravidade): ficha.clinica editar; entram POR VALIDAR; duplicado = mesmo tipo e descrição. Episódios (titulo obrigatório; tecnica, area, estado, inicio, fim): identificação ou ficha clínica editar; sem tarefas nem webhooks; duplicado = mesmo título e dia de início. Com gravar = 1 fica uma linha no recurso «importacoes» (relatório por linha sem nomes nem conteúdo clínico) e a resposta traz importacao_id. As linhas de histórico trazem «paciente» {id, numero} em vez do nome. Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After). Limite adicional: 20 pedidos por 10 minutos por endereço IP (contam só os pedidos que alteram dados).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ficheiro"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary",
                                        "description": "CSV de texto (.csv ou .txt)"
                                    },
                                    "gravar": {
                                        "type": "string",
                                        "enum": [
                                            "0",
                                            "1",
                                            "true",
                                            "sim"
                                        ],
                                        "default": "0"
                                    },
                                    "tipo": {
                                        "type": "string",
                                        "enum": [
                                            "pacientes",
                                            "consultas",
                                            "alertas",
                                            "episodios"
                                        ],
                                        "default": "pacientes"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1Importacao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "tipo": "pacientes",
                                        "colunas": {
                                            "Nome": "nome",
                                            "Apelidos": "apelidos",
                                            "E-mail": "email",
                                            "Telemóvel": "telefone",
                                            "Nascimento": "data_nascimento"
                                        },
                                        "linhas": [
                                            {
                                                "linha": 2,
                                                "nome": "Ana Sousa",
                                                "estado": "novo",
                                                "mensagens": [],
                                                "duplicado_de": null,
                                                "id": null,
                                                "paciente": null
                                            },
                                            {
                                                "linha": 3,
                                                "nome": "Rui Almeida",
                                                "estado": "duplicado",
                                                "mensagens": [
                                                    "Já existe: P-2026-0311"
                                                ],
                                                "duplicado_de": {
                                                    "id": 1204,
                                                    "numero": "P-2026-0311",
                                                    "nome": "Rui Almeida"
                                                },
                                                "id": null,
                                                "paciente": null
                                            }
                                        ],
                                        "resumo": {
                                            "total": 2,
                                            "novos": 1,
                                            "duplicados": 1,
                                            "erros": 0,
                                            "importados": 0
                                        },
                                        "importacao_id": null
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/pacientes/importar/modelos": {
            "get": {
                "tags": [
                    "Ficha do paciente"
                ],
                "operationId": "m1ModelosImportacao",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "editar",
                "summary": "Tipos de importação e colunas aceites",
                "description": "Para cada tipo (pacientes, consultas, alertas, episodios): se a pessoa o pode importar, as colunas obrigatórias, as aceites e uma linha de exemplo. Exige identificação ou ficha clínica editar (senão 403). Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "tipo": {
                                                        "type": "string"
                                                    },
                                                    "rotulo": {
                                                        "type": "string"
                                                    },
                                                    "permitido": {
                                                        "type": "boolean"
                                                    },
                                                    "obrigatorias": {
                                                        "type": "array",
                                                        "items": {
                                                            "type": "string"
                                                        }
                                                    },
                                                    "colunas": {
                                                        "type": "array",
                                                        "items": {
                                                            "type": "string"
                                                        }
                                                    },
                                                    "exemplo": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "tipo": "alertas",
                                            "rotulo": "Alertas clínicos",
                                            "permitido": true,
                                            "obrigatorias": [
                                                "descricao",
                                                "paciente (uma das colunas de identificação)"
                                            ],
                                            "colunas": [
                                                "numero anterior",
                                                "tipo",
                                                "descricao",
                                                "gravidade"
                                            ],
                                            "exemplo": "numero anterior;tipo;descricao;gravidade\nA-1022;alergia;Penicilina;alta"
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/pacientes/{id}/duplicados": {
            "get": {
                "tags": [
                    "Ficha do paciente"
                ],
                "operationId": "m1DuplicadosPaciente",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "ver",
                "summary": "Possíveis duplicados deste paciente",
                "description": "Compara o paciente com os restantes da clínica (excluindo os anonimizados): NIF igual 100, email igual 85 (95 com a mesma data de nascimento), nome muito parecido + mesma data 80, telefone igual 60 (80 com nome parecido), mesma data + mesmo último apelido 45. Só candidatos com 40 ou mais, ordenados, no máximo 12; «forte» a partir de 80. Só identificação mínima, com email e telefone mascarados — nunca dados clínicos. Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do paciente"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/M1Duplicado"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 1388,
                                            "numero": "P-2026-0490",
                                            "nome_completo": "Rui M. Almeida",
                                            "data_nascimento": "1988-04-12",
                                            "email": "r•••@exemplo.pt",
                                            "telefone": "•••••5678",
                                            "estado": "ativo",
                                            "pontuacao": 95,
                                            "forte": true,
                                            "razoes": [
                                                "email",
                                                "nome_data"
                                            ],
                                            "razoes_rotulo": [
                                                "Mesmo email",
                                                "Nome parecido e mesma data de nascimento"
                                            ]
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/pacientes/{id}/ficha": {
            "get": {
                "tags": [
                    "Ficha do paciente"
                ],
                "operationId": "m1FichaPaciente",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "resumo",
                "summary": "Abrir a ficha do paciente",
                "description": "Exige ficha.identificacao ≥ resumo e o paciente no âmbito (de identificação ou clínico), ou um acesso de emergência ativo. Devolve o cabeçalho, os episódios (sem conteúdo clínico), o episódio ativo, a jornada (etapa 1–9 e a secção a abrir em cada etapa), as secções visíveis com contador e as ações disponíveis. Contactos e data de nascimento só com ficha.identificacao ≥ ver; os alertas clínicos só para quem vê a ficha clínica do paciente (senão alertas = [] e alertas_visiveis = false); a fotografia de rosto só com ficha.fotografias. A abertura fica na auditoria («ver», ficha). Paciente fora do âmbito: 403 «sem_permissao» com erro.paciente_id (a app oferece o acesso de emergência). Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do paciente"
                    },
                    {
                        "name": "episodio_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Episódio a destacar (por omissão o ativo, ou o mais recente)"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1Ficha"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "paciente": {
                                            "id": 1204,
                                            "numero": "P-2026-0311",
                                            "nome": "Rui",
                                            "nome_completo": "Rui Almeida",
                                            "iniciais": "RA",
                                            "sexo": "M",
                                            "sexo_rotulo": "Masculino",
                                            "data_nascimento": "1988-04-12",
                                            "idade": 38,
                                            "email": "rui.almeida@exemplo.pt",
                                            "telefone": "+351912345678",
                                            "localidade": "Porto",
                                            "idioma": "pt-PT",
                                            "estado": "ativo",
                                            "estado_rotulo": "Ativo",
                                            "portal_ativo": true,
                                            "litigio": false,
                                            "medico": {
                                                "id": 7,
                                                "nome": "Inês Valente"
                                            },
                                            "responsavel": null,
                                            "foto_ficheiro_id": 8812,
                                            "criado_em": "2026-09-02T10:14:00+01:00"
                                        },
                                        "alertas": [
                                            {
                                                "id": 55,
                                                "tipo": "alergia",
                                                "tipo_rotulo": "Alergia",
                                                "gravidade": "alta",
                                                "gravidade_rotulo": "Alta",
                                                "descricao": "Alergia a penicilina (exantema)",
                                                "validado": true
                                            }
                                        ],
                                        "alertas_visiveis": true,
                                        "episodios": [
                                            {
                                                "id": 77,
                                                "numero": "E-2026-0077",
                                                "titulo": "Transplante capilar",
                                                "tecnica": "FUE",
                                                "area": "couro_cabeludo",
                                                "area_rotulo": "Couro cabeludo",
                                                "estado": "avaliacao",
                                                "estado_rotulo": "Avaliação",
                                                "etapa_jornada": 3,
                                                "medico_id": 7,
                                                "medico_nome": "Inês Valente",
                                                "aberto_em": "2026-10-02T09:30:00+01:00",
                                                "fechado_em": null,
                                                "equipa": [
                                                    {
                                                        "id": 301,
                                                        "utilizador_id": 7,
                                                        "papel": "medico",
                                                        "papel_rotulo": "Médico",
                                                        "nome": "Inês Valente"
                                                    }
                                                ]
                                            }
                                        ],
                                        "episodio_ativo": {
                                            "id": 77,
                                            "numero": "E-2026-0077",
                                            "titulo": "Transplante capilar",
                                            "tecnica": "FUE",
                                            "area": "couro_cabeludo",
                                            "area_rotulo": "Couro cabeludo",
                                            "estado": "avaliacao",
                                            "estado_rotulo": "Avaliação",
                                            "etapa_jornada": 3,
                                            "medico_id": 7,
                                            "medico_nome": "Inês Valente",
                                            "aberto_em": "2026-10-02T09:30:00+01:00",
                                            "fechado_em": null,
                                            "equipa": [
                                                {
                                                    "id": 301,
                                                    "utilizador_id": 7,
                                                    "papel": "medico",
                                                    "papel_rotulo": "Médico",
                                                    "nome": "Inês Valente"
                                                }
                                            ]
                                        },
                                        "jornada": {
                                            "etapa": 3,
                                            "episodio_id": 77,
                                            "seccoes": {
                                                "1": "linha_tempo",
                                                "2": "clinica",
                                                "3": "clinica",
                                                "4": "plano"
                                            }
                                        },
                                        "seccoes": [
                                            {
                                                "chave": "identificacao",
                                                "titulo": "Identificação",
                                                "icone": "ficha",
                                                "ordem": 10,
                                                "clinica": false,
                                                "contador": null,
                                                "modulo": "ficha.identificacao"
                                            },
                                            {
                                                "chave": "clinica",
                                                "titulo": "Clínica",
                                                "icone": "clinica",
                                                "ordem": 20,
                                                "clinica": true,
                                                "contador": 2,
                                                "modulo": "ficha.clinica"
                                            }
                                        ],
                                        "acoes": {
                                            "editar": true,
                                            "nova_consulta": true,
                                            "resumo_ia": true,
                                            "resumo_ia_configurado": true,
                                            "duplicados": true,
                                            "novo_episodio": true,
                                            "pedir_formulario": true,
                                            "emergencia": false,
                                            "prescrever_url": ""
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/pacientes/{id}/ficha/{seccao}": {
            "get": {
                "tags": [
                    "Ficha do paciente"
                ],
                "operationId": "m1FichaSeccao",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "resumo",
                "summary": "Blocos de uma secção da ficha",
                "description": "Secções descobertas em todos os módulos: identificacao, clinica, alertas, episodios, linha_tempo (M1), consentimentos, documentos, privacidade (M2), fotografias, plano, acompanhamento (M3), comunicacoes (M4), financeiro (M5), marcacoes, cirurgias (M6). Cada secção exige a permissão do seu módulo e nível (secção invisível → 403); chave inexistente ou fora do formato → 404. Os blocos seguem o formato único (kpis, lista, campos, grafico, galeria, cronologia, alerta, jornada, acoes) e nunca trazem campos sem permissão; no nível «resumo» só o resumo autorizado. A leitura das secções clínicas (clinica, alertas, fotografias, plano, acompanhamento, cirurgias) fica na auditoria («ver», ficha.<secção>). Paciente fora do âmbito: 403 «sem_permissao» com erro.paciente_id (a app oferece o acesso de emergência). Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do paciente"
                    },
                    {
                        "name": "seccao",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^[a-z][a-z0-9_]{1,40}$"
                        },
                        "example": "clinica",
                        "description": "Chave da secção"
                    },
                    {
                        "name": "episodio_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Episódio a destacar (por omissão o ativo, ou o mais recente)"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1SeccaoFicha"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "chave": "clinica",
                                        "titulo": "Clínica",
                                        "icone": "clinica",
                                        "clinica": true,
                                        "blocos": [
                                            {
                                                "tipo": "campos",
                                                "itens": [
                                                    {
                                                        "rotulo": "Escala",
                                                        "valor": "Norwood IV"
                                                    },
                                                    {
                                                        "rotulo": "Elegibilidade",
                                                        "valor": "Apto com condições",
                                                        "tom": "aviso"
                                                    }
                                                ]
                                            },
                                            {
                                                "tipo": "lista",
                                                "itens": [
                                                    {
                                                        "titulo": "Primeira consulta",
                                                        "subtitulo": "Inês Valente",
                                                        "data": "2026-10-28T10:00:00+00:00",
                                                        "ligacao": {
                                                            "web": "equipa/consulta?id=4410",
                                                            "app": "/e/consulta?id=4410"
                                                        }
                                                    }
                                                ],
                                                "vazio": "Sem consultas."
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/pacientes/{id}/fundir": {
            "post": {
                "tags": [
                    "Ficha do paciente"
                ],
                "operationId": "m1FundirPacientes",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do paciente"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "editar",
                "summary": "Fusão assistida (mantém {id})",
                "description": "Exige confirmar = true. Copia para {id} os campos indicados em «campos» (só da lista de fusão) e preenche os vazios com os de remover_id; reafeta paciente_id em todas as tabelas do sistema (só linhas da clínica atual), numa transação; arquiva e apaga logicamente remover_id. Tabelas imutáveis que recusem a alteração ficam em «ignoradas». 422 se for o mesmo paciente, se não existir ou se algum estiver anonimizado. Efeitos: linha do tempo, auditoria «alterar» (mantido) e «apagar» (removido), webhook paciente.fundido. Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "remover_id": {
                                        "type": "integer",
                                        "minimum": 1
                                    },
                                    "confirmar": {
                                        "const": true
                                    },
                                    "campos": {
                                        "type": "array",
                                        "items": {
                                            "type": "string",
                                            "enum": [
                                                "apelidos",
                                                "sexo",
                                                "data_nascimento",
                                                "nif",
                                                "documento_tipo",
                                                "documento_numero",
                                                "email",
                                                "telefone",
                                                "telefone_alt",
                                                "morada",
                                                "codigo_postal",
                                                "localidade",
                                                "pais",
                                                "nacionalidade",
                                                "idioma",
                                                "profissao",
                                                "medico_id",
                                                "responsavel_id",
                                                "origem",
                                                "cliente_desde"
                                            ]
                                        }
                                    }
                                },
                                "required": [
                                    "remover_id",
                                    "confirmar"
                                ]
                            },
                            "example": {
                                "remover_id": 1388,
                                "confirmar": true,
                                "campos": [
                                    "telefone",
                                    "morada"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1ResultadoFusao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "manter_id": 1204,
                                        "remover_id": 1388,
                                        "campos": [
                                            "telefone",
                                            "morada"
                                        ],
                                        "reafetados": {
                                            "consultas": 1,
                                            "marcacoes": 2,
                                            "formularios_respostas": 1
                                        },
                                        "ignoradas": []
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/pacientes/{id}/fundir/{outro_id}": {
            "get": {
                "tags": [
                    "Ficha do paciente"
                ],
                "operationId": "m1CompararFusao",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "editar",
                "summary": "Comparação lado a lado para a fusão",
                "description": "Só identificação (nome completo e os campos que a fusão pode copiar); NIF e documento mascarados. {id} é o paciente que fica, {outro_id} o que será integrado. Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do paciente"
                    },
                    {
                        "name": "outro_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Paciente a integrar (será removido)"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1ComparacaoFusao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "manter": {
                                            "id": 1204,
                                            "numero": "P-2026-0311",
                                            "nome_completo": "Rui Almeida"
                                        },
                                        "remover": {
                                            "id": 1388,
                                            "numero": "P-2026-0490",
                                            "nome_completo": "Rui M. Almeida"
                                        },
                                        "campos": [
                                            {
                                                "campo": "telefone",
                                                "rotulo": "Telefone",
                                                "manter": "+351912345678",
                                                "remover": "+351934567890",
                                                "igual": false
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/pacientes/{id}/medicacao": {
            "get": {
                "tags": [
                    "Ficha do paciente"
                ],
                "operationId": "m1AlertasMedicacao",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "ver",
                "summary": "Alertas de medicação antes de prescrever",
                "description": "Verifica um fármaco contra a ficha do próprio paciente: 1) alergias registadas (alertas ativos do tipo alergia e alergias da última consulta) que referem o fármaco → «bloqueio»; 2) regras de contraindicação configuradas pela clínica (fármaco | termos a procurar na ficha | mensagem | alerta ou bloqueio). seguro = false quando há algum bloqueio. A prescrição em si faz-se no software certificado configurado pela clínica. Exige acesso clínico ao paciente. Paciente fora do âmbito: 403 «sem_permissao» com erro.paciente_id (a app oferece o acesso de emergência). Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do paciente"
                    },
                    {
                        "name": "farmaco",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 120
                        },
                        "description": "Fármaco a verificar (menos de 3 letras úteis → sem alertas)"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1AlertasMedicacao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "farmaco": "amoxicilina",
                                        "alertas": [
                                            {
                                                "nivel": "bloqueio",
                                                "mensagem": "Alergia registada: Alergia a penicilina (exantema)",
                                                "origem": "alergia"
                                            },
                                            {
                                                "nivel": "bloqueio",
                                                "mensagem": "Alergia registada a penicilinas ou betalactâmicos.",
                                                "origem": "regra"
                                            }
                                        ],
                                        "seguro": false
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/pacientes/{id}/resumo": {
            "get": {
                "tags": [
                    "Ficha do paciente"
                ],
                "operationId": "m1UltimoResumo",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Último resumo da ficha (médicos)",
                "description": "Último resumo gerado para o paciente (proposta do tipo «resumo» pendente ou aceite), para mostrar sem gerar outro; null quando não há. Só médicos (família de perfil «medico») com «editar» em ficha.clinica e o paciente no âmbito clínico; os outros perfis recebem 403. Paciente fora do âmbito: 403 «sem_permissao» com erro.paciente_id (a app oferece o acesso de emergência). Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do paciente"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "oneOf": [
                                                {
                                                    "$ref": "#/components/schemas/M1PropostaIa"
                                                },
                                                {
                                                    "type": "null"
                                                }
                                            ]
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 9101,
                                        "paciente_id": 1204,
                                        "episodio_id": 77,
                                        "consulta_id": null,
                                        "resposta_id": null,
                                        "tipo": "resumo",
                                        "tipo_rotulo": "Resumo da ficha",
                                        "campo": "resumo",
                                        "campo_rotulo": "Resumo",
                                        "valor_proposto": "1) Homem de 38 anos, primeira consulta por queda frontal. 2) Alergia a penicilina; toma apixabano…",
                                        "excerto_origem": null,
                                        "fatores": {
                                            "fontes": {
                                                "alertas": 1,
                                                "consultas": 3,
                                                "episodios": 1
                                            }
                                        },
                                        "confianca": 0.92,
                                        "estado": "pendente",
                                        "estado_rotulo": "Pendente",
                                        "valor_final": null,
                                        "decidido_por": null,
                                        "decidido_em": null,
                                        "motivo": null,
                                        "lote": "3f2a9c0d6b1e4a7f8c2d5e9b0a1f3c4d",
                                        "criado_em": "2026-10-28T10:22:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            },
            "post": {
                "tags": [
                    "Ficha do paciente"
                ],
                "operationId": "m1GerarResumo",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do paciente"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Gerar o resumo da ficha antes da consulta (médicos)",
                "description": "Junta no servidor o essencial da ficha (idade, sexo, alertas ativos, últimas 3 consultas, episódios, complicações e o último questionário prévio) e pede ao assistente de IA da clínica um resumo de até 12 linhas. Sem corpo. Usa o assistente de IA da clínica: exige o consentimento «ia» válido do paciente e o uso configurado (senão 422). O resultado nunca é uma decisão — cada valor fica como proposta pendente (ia_propostas) com o modelo usado, os parâmetros do pedido e os fatores explicativos registados, até um médico a aceitar, corrigir ou recusar. Só médicos (família de perfil «medico») com «editar» em ficha.clinica e o paciente no âmbito clínico; os outros perfis recebem 403. Devolve a proposta criada (tipo «resumo», campo «resumo»). Efeitos: proposta pendente, auditoria «criar» em ia_propostas. Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After). Limite adicional: 20 pedidos por 10 minutos por endereço IP (contam só os pedidos que alteram dados).",
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1PropostaIa"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/pacientes/{id}/resumo-fhir": {
            "get": {
                "tags": [
                    "Ficha do paciente"
                ],
                "operationId": "m1ResumoFhir",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "ver",
                "summary": "Resumo do paciente em HL7 FHIR R4 (International Patient Summary)",
                "description": "Preparação para o Espaço Europeu de Dados de Saúde. Bundle FHIR R4 «document» com o perfil IPS: Composition (LOINC 60591-5), Patient (número de processo, nome, sexo, data de nascimento — sem NIF, documento, contactos nem morada), Organization (a clínica), secções de alergias (48765-2), medicação (10160-0) e problemas (11450-4) a partir dos alertas clínicos ativos (validado → confirmed, por validar → unconfirmed) e dos diagnósticos das consultas assinadas, e de procedimentos (47519-4) a partir dos episódios na cirurgia ou depois; sem dados, as entradas «absent/unknown» do IPS. As secções que o paciente restringiu no portal ficam de fora (emptyReason «withheld»), salvo acesso de emergência, que fica registado. Por omissão devolve o JSON FHIR tal como é (application/fhir+json); com envelope=1 vem no envelope comum com meta.ficheiro. Equipa e integrações; o paciente tem de estar no âmbito clínico. Efeitos: auditoria «exportar». Paciente fora do âmbito: 403 «sem_permissao» com erro.paciente_id (a app oferece o acesso de emergência). Limite (por omissão): 120 pedidos por minuto por token da equipa; nas integrações vale o limite por minuto definido no cliente de integração (429 com Retry-After). Limite adicional: 30 pedidos por 10 minutos por endereço IP (contam só os pedidos que alteram dados).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do paciente"
                    },
                    {
                        "name": "envelope",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "1"
                            ]
                        },
                        "description": "1 → no envelope comum {ok, dados, meta}"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Bundle FHIR R4 (IPS)",
                        "content": {
                            "application/fhir+json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "resourceType",
                                        "type",
                                        "entry"
                                    ],
                                    "properties": {
                                        "resourceType": {
                                            "const": "Bundle"
                                        },
                                        "type": {
                                            "const": "document"
                                        },
                                        "timestamp": {
                                            "type": [
                                                "string",
                                                "null"
                                            ],
                                            "format": "date-time"
                                        },
                                        "entry": {
                                            "type": "array",
                                            "items": {
                                                "type": "object"
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "resourceType": "Bundle",
                                    "type": "document",
                                    "timestamp": "2026-10-29T10:00:00+00:00",
                                    "entry": [
                                        {
                                            "fullUrl": "urn:uuid:…",
                                            "resource": {
                                                "resourceType": "Composition",
                                                "status": "final",
                                                "type": {
                                                    "coding": [
                                                        {
                                                            "system": "http://loinc.org",
                                                            "code": "60591-5"
                                                        }
                                                    ]
                                                }
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/painel": {
            "get": {
                "tags": [
                    "Painel"
                ],
                "operationId": "obterPainel",
                "summary": "Painel da pessoa",
                "description": "Descobre os cartões de todos os módulos visíveis a quem pede (permissões e módulos ativos da clínica), ordena-os pelo perfil e pelas preferências guardadas e devolve o conteúdo de cada um em blocos (kpis, lista, campos, grafico, galeria, cronologia, alerta, jornada, acoes).\n\nCartões ocultos vêm com oculto=true e sem blocos. Um cartão que falhe vem com um bloco «alerta» e erro=falhou — os restantes continuam.",
                "x-anagen-modulo": null,
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "periodo",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "hoje",
                                "semana",
                                "mes",
                                "30d",
                                "trimestre",
                                "ano"
                            ]
                        },
                        "description": "Período dos números do painel.",
                        "example": "mes"
                    },
                    {
                        "name": "de",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Início personalizado."
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Fim personalizado."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Painel"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "periodo": {
                                            "chave": "mes",
                                            "de": "2026-10-01",
                                            "ate": "2026-10-28",
                                            "rotulo": "Este mês"
                                        },
                                        "saudacao": "Bom dia, Ana",
                                        "preferencias": {
                                            "ordem": [
                                                "resumo_executivo",
                                                "tarefas_de_hoje"
                                            ],
                                            "ocultos": [],
                                            "larguras": [],
                                            "periodo": "mes"
                                        },
                                        "blocos": [
                                            {
                                                "chave": "tarefas_de_hoje",
                                                "titulo": "As minhas tarefas",
                                                "icone": "tarefas",
                                                "largura": 2,
                                                "oculto": false,
                                                "blocos": [
                                                    {
                                                        "tipo": "kpis",
                                                        "itens": [
                                                            {
                                                                "rotulo": "Em atraso",
                                                                "valor": 2
                                                            }
                                                        ]
                                                    }
                                                ]
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/painel/blocos/{chave}": {
            "get": {
                "tags": [
                    "Painel"
                ],
                "operationId": "obterCartaoDoPainel",
                "summary": "Um cartão do painel",
                "description": "Conteúdo atualizado de um só cartão (atualização ao vivo). 404 se o cartão não existir ou não for visível.",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "chave",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "example": "tarefas_de_hoje"
                    },
                    {
                        "name": "periodo",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Período.",
                        "example": "mes"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CartaoPainel"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/painel/preferencias": {
            "put": {
                "tags": [
                    "Painel"
                ],
                "operationId": "gravarPreferenciasDoPainel",
                "summary": "Guardar a disposição do painel",
                "description": "Ordem, cartões ocultos, larguras (1–3) e período por omissão. Só chaves de cartões existentes são aceites. Fica guardado por pessoa (não afeta colegas) e é auditado.",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/PreferenciasPainel"
                            },
                            "example": {
                                "ordem": [
                                    "resumo_executivo",
                                    "tarefas_de_hoje",
                                    "chat_por_ler"
                                ],
                                "ocultos": [
                                    "comunicados_por_ler"
                                ],
                                "larguras": {
                                    "resumo_executivo": 3
                                },
                                "periodo": "semana"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PreferenciasPainel"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/painel/repor": {
            "post": {
                "tags": [
                    "Painel"
                ],
                "operationId": "reporPainel",
                "summary": "Repor a disposição de origem",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PreferenciasPainel"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    }
                }
            }
        },
        "/parceiros/auth/entrar": {
            "post": {
                "tags": [
                    "Parceiros"
                ],
                "operationId": "parceiroEntrar",
                "summary": "Entrar (obter o token)",
                "description": "Mensagem igual para email inexistente ou palavra-passe errada. 403 conta_inativa quando a conta está por confirmar, por aprovar, suspensa ou recusada. 404 quando o portal de parceiros está desligado na clínica.",
                "x-anagen-modulo": "parceiros",
                "x-anagen-nivel": "publico",
                "security": [],
                "parameters": [
                    {
                        "name": "X-AX-Clinica",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Código da clínica (na app; na web vale o domínio)."
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "email",
                                    "palavra_passe"
                                ],
                                "properties": {
                                    "email": {
                                        "type": "string",
                                        "format": "email"
                                    },
                                    "palavra_passe": {
                                        "type": "string"
                                    },
                                    "dispositivo": {
                                        "type": "string",
                                        "maxLength": 190
                                    }
                                }
                            },
                            "example": {
                                "email": "dra.silva@clinica-parceira.pt",
                                "palavra_passe": "••••••••••••",
                                "dispositivo": "iPhone"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "token": {
                                                    "type": "string"
                                                },
                                                "expira_em": {
                                                    "type": "string",
                                                    "format": "date-time"
                                                },
                                                "parceiro": {
                                                    "$ref": "#/components/schemas/PerfilParceiro"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "token": "axp_9f0c…",
                                        "expira_em": "2026-11-28T10:00:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/parceiros/auth/recuperar": {
            "post": {
                "tags": [
                    "Parceiros"
                ],
                "operationId": "parceiroRecuperar",
                "summary": "Pedir nova palavra-passe",
                "x-anagen-modulo": "parceiros",
                "x-anagen-nivel": "publico",
                "security": [],
                "parameters": [
                    {
                        "name": "X-AX-Clinica",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Código da clínica (na app; na web vale o domínio)."
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "email"
                                ],
                                "properties": {
                                    "email": {
                                        "type": "string",
                                        "format": "email"
                                    }
                                }
                            },
                            "example": {
                                "email": "dra.silva@clinica-parceira.pt"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/parceiros/auth/registar": {
            "post": {
                "tags": [
                    "Parceiros"
                ],
                "operationId": "parceiroRegistar",
                "summary": "Pedir acesso",
                "description": "Cria a conta «por confirmar» e envia a ligação de verificação (48 h). Resposta igual exista ou não o email. Campo armadilha «website» deve ir vazio.",
                "x-anagen-modulo": "parceiros",
                "x-anagen-nivel": "publico",
                "security": [],
                "parameters": [
                    {
                        "name": "X-AX-Clinica",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Código da clínica (na app; na web vale o domínio)."
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "tipo",
                                    "nome",
                                    "email",
                                    "palavra_passe",
                                    "termos"
                                ],
                                "properties": {
                                    "tipo": {
                                        "type": "string",
                                        "enum": [
                                            "medico",
                                            "clinica",
                                            "outro"
                                        ]
                                    },
                                    "nome": {
                                        "type": "string",
                                        "maxLength": 160
                                    },
                                    "organizacao": {
                                        "type": "string",
                                        "maxLength": 190
                                    },
                                    "email": {
                                        "type": "string",
                                        "format": "email"
                                    },
                                    "telefone": {
                                        "type": "string"
                                    },
                                    "cedula": {
                                        "type": "string",
                                        "maxLength": 30
                                    },
                                    "palavra_passe": {
                                        "type": "string",
                                        "minLength": 12
                                    },
                                    "termos": {
                                        "type": "boolean"
                                    }
                                }
                            },
                            "example": {
                                "tipo": "medico",
                                "nome": "Marta Silva",
                                "organizacao": "Clínica Dermatológica Exemplo",
                                "email": "dra.silva@clinica-parceira.pt",
                                "palavra_passe": "••••••••••••",
                                "termos": true
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/parceiros/auth/sair": {
            "post": {
                "tags": [
                    "Parceiros"
                ],
                "operationId": "parceiroSair",
                "summary": "Terminar a sessão (revoga o token)",
                "x-anagen-modulo": "parceiros",
                "x-anagen-nivel": "parceiro",
                "security": [],
                "parameters": [
                    {
                        "name": "X-AX-Parceiro",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^axp_[a-f0-9]{40}$"
                        },
                        "description": "Token do parceiro (também aceite como Authorization: Bearer axp_…)."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ok": {
                                                    "type": "boolean"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    }
                }
            }
        },
        "/parceiros/conta": {
            "get": {
                "tags": [
                    "Parceiros"
                ],
                "operationId": "parceiroConta",
                "summary": "A minha conta",
                "x-anagen-modulo": "parceiros",
                "x-anagen-nivel": "parceiro",
                "security": [],
                "parameters": [
                    {
                        "name": "X-AX-Parceiro",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^axp_[a-f0-9]{40}$"
                        },
                        "description": "Token do parceiro (também aceite como Authorization: Bearer axp_…)."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PerfilParceiro"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    }
                }
            }
        },
        "/parceiros/conta/palavra-passe": {
            "post": {
                "tags": [
                    "Parceiros"
                ],
                "operationId": "parceiroPalavraPasse",
                "summary": "Mudar a palavra-passe",
                "description": "Termina todas as sessões e tokens (sessao_terminada=true): entre de novo.",
                "x-anagen-modulo": "parceiros",
                "x-anagen-nivel": "parceiro",
                "security": [],
                "parameters": [
                    {
                        "name": "X-AX-Parceiro",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^axp_[a-f0-9]{40}$"
                        },
                        "description": "Token do parceiro (também aceite como Authorization: Bearer axp_…)."
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "atual",
                                    "nova"
                                ],
                                "properties": {
                                    "atual": {
                                        "type": "string"
                                    },
                                    "nova": {
                                        "type": "string",
                                        "minLength": 12
                                    }
                                }
                            },
                            "example": {
                                "atual": "••••••••••••",
                                "nova": "••••••••••••••"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                },
                                                "sessao_terminada": {
                                                    "type": "boolean"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/parceiros/encaminhamentos": {
            "post": {
                "tags": [
                    "Parceiros"
                ],
                "operationId": "parceiroEncaminhar",
                "summary": "Encaminhar um paciente",
                "description": "O parceiro declara que o paciente aceitou ser contactado. Cria o lead no CRM da clínica (origem «recomendação») e avisa a equipa. Pelo menos email ou telefone. Evite dados de saúde na nota.",
                "x-anagen-modulo": "parceiros",
                "x-anagen-nivel": "parceiro",
                "security": [],
                "parameters": [
                    {
                        "name": "X-AX-Parceiro",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^axp_[a-f0-9]{40}$"
                        },
                        "description": "Token do parceiro (também aceite como Authorization: Bearer axp_…)."
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "nome",
                                    "declaracao"
                                ],
                                "properties": {
                                    "nome": {
                                        "type": "string",
                                        "maxLength": 160
                                    },
                                    "email": {
                                        "type": "string",
                                        "format": "email"
                                    },
                                    "telefone": {
                                        "type": "string"
                                    },
                                    "nota": {
                                        "type": "string",
                                        "maxLength": 1000
                                    },
                                    "procedimento_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "declaracao": {
                                        "type": "boolean"
                                    }
                                }
                            },
                            "example": {
                                "nome": "João Pereira",
                                "telefone": "+351912345678",
                                "declaracao": true
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EncaminhamentoParceiro"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 14,
                                        "codigo": "EN-3FA21C",
                                        "nome": "João Pereira",
                                        "contacto": {
                                            "telefone": "+351912345678"
                                        },
                                        "criado_em": "2026-10-21T10:02:00+00:00",
                                        "estado": "avaliacao",
                                        "estado_rotulo": "Em avaliação",
                                        "autorizado": false,
                                        "recompensa": {
                                            "aplicavel": false,
                                            "estado": null,
                                            "rotulo": "Não aplicável"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/parceiros/encaminhamentos/{id}": {
            "get": {
                "tags": [
                    "Parceiros"
                ],
                "operationId": "parceiroEncaminhamento",
                "summary": "Um encaminhamento (estado e, com autorização, evolução)",
                "x-anagen-modulo": "parceiros",
                "x-anagen-nivel": "parceiro",
                "security": [],
                "parameters": [
                    {
                        "name": "X-AX-Parceiro",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^axp_[a-f0-9]{40}$"
                        },
                        "description": "Token do parceiro (também aceite como Authorization: Bearer axp_…)."
                    },
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 14
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "allOf": [
                                                {
                                                    "$ref": "#/components/schemas/EncaminhamentoParceiro"
                                                },
                                                {
                                                    "type": "object",
                                                    "properties": {
                                                        "nota": {
                                                            "type": [
                                                                "string",
                                                                "null"
                                                            ]
                                                        },
                                                        "passos": {
                                                            "type": "array",
                                                            "items": {
                                                                "type": "object"
                                                            }
                                                        },
                                                        "autorizacao": {
                                                            "type": [
                                                                "object",
                                                                "null"
                                                            ]
                                                        },
                                                        "evolucao": {
                                                            "type": [
                                                                "object",
                                                                "null"
                                                            ],
                                                            "properties": {
                                                                "consulta_em": {
                                                                    "type": [
                                                                        "string",
                                                                        "null"
                                                                    ],
                                                                    "format": "date"
                                                                },
                                                                "cirurgia_em": {
                                                                    "type": [
                                                                        "string",
                                                                        "null"
                                                                    ],
                                                                    "format": "date"
                                                                },
                                                                "procedimento": {
                                                                    "type": [
                                                                        "string",
                                                                        "null"
                                                                    ]
                                                                },
                                                                "marcos_feitos": {
                                                                    "type": [
                                                                        "integer",
                                                                        "null"
                                                                    ]
                                                                },
                                                                "marcos_total": {
                                                                    "type": [
                                                                        "integer",
                                                                        "null"
                                                                    ]
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            ]
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/parceiros/painel": {
            "get": {
                "tags": [
                    "Parceiros"
                ],
                "operationId": "parceiroPainel",
                "summary": "Os meus encaminhamentos",
                "x-anagen-modulo": "parceiros",
                "x-anagen-nivel": "parceiro",
                "security": [],
                "parameters": [
                    {
                        "name": "X-AX-Parceiro",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^axp_[a-f0-9]{40}$"
                        },
                        "description": "Token do parceiro (também aceite como Authorization: Bearer axp_…)."
                    },
                    {
                        "name": "estado",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "recebido",
                                "em_contacto",
                                "avaliacao",
                                "concluido",
                                "sem_seguimento"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "parceiro": {
                                                    "$ref": "#/components/schemas/PerfilParceiro"
                                                },
                                                "kpis": {
                                                    "type": "object"
                                                },
                                                "estados": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "filtro": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "encaminhamentos": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/EncaminhamentoParceiro"
                                                    }
                                                },
                                                "recompensas": {
                                                    "type": "boolean"
                                                },
                                                "procedimentos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "integer"
                                                            },
                                                            "nome": {
                                                                "type": "string"
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    }
                }
            }
        },
        "/perfil": {
            "get": {
                "tags": [
                    "Perfil"
                ],
                "operationId": "obterPerfil",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "O meu perfil",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "nome": {
                                                    "type": "string"
                                                },
                                                "email": {
                                                    "type": "string"
                                                },
                                                "telefone": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "tema": {
                                                    "type": "string",
                                                    "enum": [
                                                        "sistema",
                                                        "claro",
                                                        "escuro"
                                                    ]
                                                },
                                                "idioma": {
                                                    "type": "string"
                                                },
                                                "foto_url": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "perfil": {
                                                    "type": "object"
                                                },
                                                "segundo_fator": {
                                                    "type": "boolean"
                                                },
                                                "codigos_restantes": {
                                                    "type": "integer"
                                                },
                                                "sigilo_versao": {
                                                    "type": "integer"
                                                },
                                                "sigilo_aceite_em": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                },
                                                "ultimo_acesso_em": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    }
                }
            },
            "put": {
                "tags": [
                    "Perfil"
                ],
                "operationId": "gravarPerfil",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Alterar dados pessoais e preferências (só os campos enviados)",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "nome": {
                                        "type": "string"
                                    },
                                    "telefone": {
                                        "type": "string"
                                    },
                                    "tema": {
                                        "type": "string",
                                        "enum": [
                                            "sistema",
                                            "claro",
                                            "escuro"
                                        ]
                                    },
                                    "idioma": {
                                        "type": "string",
                                        "enum": [
                                            "pt-PT",
                                            "pt-BR",
                                            "en",
                                            "es",
                                            "fr",
                                            "de"
                                        ]
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/perfil/2fa": {
            "get": {
                "tags": [
                    "Perfil"
                ],
                "operationId": "estadoSegundoFator",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Estado do segundo fator",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ativo": {
                                                    "type": "boolean"
                                                },
                                                "obrigatorio": {
                                                    "type": "boolean"
                                                },
                                                "codigos_restantes": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    }
                }
            }
        },
        "/perfil/2fa/ativar": {
            "post": {
                "tags": [
                    "Perfil"
                ],
                "operationId": "ativarSegundoFator",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Confirmar e ativar o segundo fator",
                "description": "«atual» (palavra-passe) só é exigida quando o segundo fator já estava ativo (reconfiguração). Devolve os códigos de recuperação.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "codigo": {
                                        "type": "string"
                                    },
                                    "atual": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "codigo"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "codigos_recuperacao": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/perfil/2fa/codigos": {
            "post": {
                "tags": [
                    "Perfil"
                ],
                "operationId": "novosCodigosRecuperacao",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Gerar novos códigos de recuperação",
                "description": "Confirme com a palavra-passe («atual») ou com um código («codigo»). Os anteriores deixam de valer. Também em POST /perfil/codigos.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "atual": {
                                        "type": "string"
                                    },
                                    "codigo": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "codigos_recuperacao": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/perfil/2fa/desativar": {
            "post": {
                "tags": [
                    "Perfil"
                ],
                "operationId": "desativarSegundoFator",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Desativar o segundo fator",
                "description": "Recusado quando a clínica o torna obrigatório. Exige um código válido.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "codigo": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "codigo"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ativo": {
                                                    "type": "boolean"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/perfil/2fa/iniciar": {
            "post": {
                "tags": [
                    "Perfil"
                ],
                "operationId": "iniciarSegundoFator",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Iniciar a configuração do segundo fator",
                "description": "Devolve o segredo e o endereço otpauth:// (código QR). Fica por confirmar durante 10 minutos.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "segredo": {
                                                    "type": "string"
                                                },
                                                "otpauth": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    }
                }
            }
        },
        "/perfil/codigos": {
            "post": {
                "tags": [
                    "Perfil"
                ],
                "operationId": "novosCodigosRecuperacaoAlias",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Gerar novos códigos de recuperação (alias)",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "atual": {
                                        "type": "string"
                                    },
                                    "codigo": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "codigos_recuperacao": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/perfil/palavra-passe": {
            "post": {
                "tags": [
                    "Perfil"
                ],
                "operationId": "mudarPalavraPasse",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Mudar a palavra-passe",
                "description": "Termina as outras sessões da conta.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "atual": {
                                        "type": "string"
                                    },
                                    "nova": {
                                        "type": "string",
                                        "minLength": 12
                                    }
                                },
                                "required": [
                                    "atual",
                                    "nova"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/perfil/sessoes": {
            "get": {
                "tags": [
                    "Perfil"
                ],
                "operationId": "sessoes",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Sessões abertas da app",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "string"
                                                    },
                                                    "dispositivo": {
                                                        "type": "string"
                                                    },
                                                    "plataforma": {
                                                        "type": "string"
                                                    },
                                                    "ip": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "ultimo_uso_em": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ],
                                                        "format": "date-time"
                                                    },
                                                    "criado_em": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ],
                                                        "format": "date-time"
                                                    },
                                                    "atual": {
                                                        "type": "boolean"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    }
                }
            },
            "delete": {
                "tags": [
                    "Perfil"
                ],
                "operationId": "terminarOutrasSessoes",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Terminar todas as outras sessões",
                "description": "Também em POST /perfil/sessoes/revogar.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    }
                }
            }
        },
        "/perfil/sessoes/revogar": {
            "post": {
                "tags": [
                    "Perfil"
                ],
                "operationId": "terminarOutrasSessoesPost",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Terminar todas as outras sessões",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    }
                }
            }
        },
        "/perfil/sessoes/{id}": {
            "delete": {
                "tags": [
                    "Perfil"
                ],
                "operationId": "terminarSessao",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Terminar uma sessão",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/permissoes": {
            "get": {
                "tags": [
                    "Permissões"
                ],
                "operationId": "matrizPermissoes",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Matriz de permissões",
                "description": "perfis, modulos (com grupo, clínico, sempre ativo), celulas/matriz (perfil_id → módulo → {nivel, ambito, aprovar, exportar}), tetos (limites de proteção de dados por família de perfil), ambitos, fases (regras de fase por perfil), cargos (acréscimos por cargo), recursos (com campos configuráveis) e editavel. Exige Utilizadores › Ver.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "perfis": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "modulos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "celulas": {
                                                    "type": "object"
                                                },
                                                "matriz": {
                                                    "type": "object"
                                                },
                                                "tetos": {
                                                    "type": "object"
                                                },
                                                "ambitos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "fases": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "cargos": {
                                                    "type": "object"
                                                },
                                                "recursos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "editavel": {
                                                    "type": "boolean"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            },
            "put": {
                "tags": [
                    "Permissões"
                ],
                "operationId": "gravarCelulas",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Gravar células da matriz",
                "description": "Valores acima do teto de proteção de dados são recusados. Ninguém retira a si próprio a gestão de acessos.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "celulas": {
                                        "type": "array",
                                        "items": {
                                            "type": "object",
                                            "required": [
                                                "perfil_id",
                                                "modulo",
                                                "nivel"
                                            ],
                                            "properties": {
                                                "perfil_id": {
                                                    "type": "integer"
                                                },
                                                "modulo": {
                                                    "type": "string"
                                                },
                                                "nivel": {
                                                    "type": "string",
                                                    "enum": [
                                                        "nenhum",
                                                        "resumo",
                                                        "ver",
                                                        "editar"
                                                    ]
                                                },
                                                "ambito": {
                                                    "type": "string",
                                                    "enum": [
                                                        "proprios",
                                                        "equipa",
                                                        "departamento",
                                                        "todos"
                                                    ]
                                                },
                                                "aprovar": {
                                                    "type": "boolean"
                                                },
                                                "exportar": {
                                                    "type": "boolean"
                                                }
                                            }
                                        }
                                    }
                                },
                                "required": [
                                    "celulas"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "gravadas": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/permissoes/campos": {
            "get": {
                "tags": [
                    "Permissões"
                ],
                "operationId": "permissoesCamposRecursos",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Recursos com campos configuráveis por perfil",
                "parameters": [
                    {
                        "name": "perfil_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "chave": {
                                                        "type": "string"
                                                    },
                                                    "titulo": {
                                                        "type": "string"
                                                    },
                                                    "modulo": {
                                                        "type": "string"
                                                    },
                                                    "grupo": {
                                                        "type": "string"
                                                    },
                                                    "campos": {
                                                        "type": "integer"
                                                    },
                                                    "regras": {
                                                        "type": "integer"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/permissoes/campos/{perfil_id}/{recurso}": {
            "get": {
                "tags": [
                    "Permissões"
                ],
                "operationId": "permissoesCampos",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Campos de um recurso com a regra do perfil",
                "description": "regra: '' (como na definição), oculto (nunca sai do servidor) ou so_leitura (a escrita é recusada). Campos obrigatórios e os campos de utilizadores/perfis do próprio perfil não aceitam regras (bloqueado + motivo).",
                "parameters": [
                    {
                        "name": "perfil_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "recurso",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "perfil": {
                                                    "type": "object"
                                                },
                                                "recurso": {
                                                    "type": "object"
                                                },
                                                "campos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "editavel": {
                                                    "type": "boolean"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            },
            "put": {
                "tags": [
                    "Permissões"
                ],
                "operationId": "gravarPermissoesCampos",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Gravar campos ocultos ou só de leitura",
                "parameters": [
                    {
                        "name": "perfil_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "recurso",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "campos": {
                                        "type": "object",
                                        "additionalProperties": {
                                            "type": "string",
                                            "enum": [
                                                "",
                                                "oculto",
                                                "so_leitura"
                                            ]
                                        }
                                    }
                                },
                                "required": [
                                    "campos"
                                ]
                            },
                            "example": {
                                "campos": {
                                    "valor_estimado": "oculto",
                                    "origem": "so_leitura",
                                    "notas": ""
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "gravadas": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/permissoes/cargos": {
            "get": {
                "tags": [
                    "Permissões"
                ],
                "operationId": "permissoesCargos",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Permissões por cargo",
                "description": "Acréscimos para chefe_equipa e direcao, por departamento ('' = todos): celulas[cargo][departamento][modulo] = {nivel, ambito, aprovar, exportar}; ambito_por_cargo (chefe → equipa, direção → departamento nos módulos não clínicos) e se está ligado na clínica. Os tetos de proteção de dados aplicam-se sempre.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "cargos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "departamentos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "celulas": {
                                                    "type": "object"
                                                },
                                                "ambito_por_cargo": {
                                                    "type": "object"
                                                },
                                                "ambito_por_cargo_ativo": {
                                                    "type": "boolean"
                                                },
                                                "modulos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "ambitos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "editavel": {
                                                    "type": "boolean"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            },
            "put": {
                "tags": [
                    "Permissões"
                ],
                "operationId": "gravarCargos",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Gravar acréscimos por cargo (nível «nenhum» retira)",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "celulas": {
                                        "type": "array",
                                        "items": {
                                            "type": "object",
                                            "required": [
                                                "cargo",
                                                "modulo",
                                                "nivel"
                                            ],
                                            "properties": {
                                                "cargo": {
                                                    "type": "string",
                                                    "enum": [
                                                        "chefe_equipa",
                                                        "direcao"
                                                    ]
                                                },
                                                "departamento": {
                                                    "type": "string"
                                                },
                                                "modulo": {
                                                    "type": "string"
                                                },
                                                "nivel": {
                                                    "type": "string",
                                                    "enum": [
                                                        "nenhum",
                                                        "resumo",
                                                        "ver",
                                                        "editar"
                                                    ]
                                                },
                                                "ambito": {
                                                    "type": "string",
                                                    "enum": [
                                                        "proprios",
                                                        "equipa",
                                                        "departamento",
                                                        "todos"
                                                    ]
                                                },
                                                "aprovar": {
                                                    "type": "boolean"
                                                },
                                                "exportar": {
                                                    "type": "boolean"
                                                }
                                            }
                                        }
                                    }
                                },
                                "required": [
                                    "celulas"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "gravadas": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/permissoes/excecoes/{id}/revogar": {
            "post": {
                "tags": [
                    "Permissões"
                ],
                "operationId": "revogarExcecao",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Revogar uma exceção antes do prazo",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": "string",
                                        "minLength": 5,
                                        "maxLength": 255
                                    }
                                },
                                "required": [
                                    "motivo"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "utilizador_id": {
                                                    "type": "integer"
                                                },
                                                "excecoes": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/permissoes/fases": {
            "get": {
                "tags": [
                    "Permissões"
                ],
                "operationId": "permissoesFases",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Regras de fase por perfil",
                "description": "Dimensão «fase» da matriz: regras declaradas por módulo (tipo estado|preenchido|dia|passado|jornada) e, por perfil, {ativa, nivel (máximo dentro da fase: nenhum|resumo|ver), origem perfil|omissao}. Ex.: o comercial edita a proposta só até ser aceite; a enfermagem só regista no dia da cirurgia. Exige Utilizadores › Ver.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "perfis": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "regras": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "niveis": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "editavel": {
                                                    "type": "boolean"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            },
            "put": {
                "tags": [
                    "Permissões"
                ],
                "operationId": "gravarFases",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Ligar/desligar regras de fase por perfil",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "regras": {
                                        "type": "array",
                                        "items": {
                                            "type": "object",
                                            "required": [
                                                "perfil_id",
                                                "modulo",
                                                "regra"
                                            ],
                                            "properties": {
                                                "perfil_id": {
                                                    "type": "integer"
                                                },
                                                "modulo": {
                                                    "type": "string"
                                                },
                                                "regra": {
                                                    "type": "string"
                                                },
                                                "ativa": {
                                                    "type": "boolean"
                                                },
                                                "nivel": {
                                                    "type": "string",
                                                    "enum": [
                                                        "nenhum",
                                                        "resumo",
                                                        "ver"
                                                    ]
                                                }
                                            }
                                        }
                                    }
                                },
                                "required": [
                                    "regras"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "gravadas": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/permissoes/perfis": {
            "post": {
                "tags": [
                    "Permissões"
                ],
                "operationId": "clonarPerfil",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Criar perfil a partir de outro",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "base_id": {
                                        "type": "integer"
                                    },
                                    "nome": {
                                        "type": "string"
                                    },
                                    "descricao": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "base_id",
                                    "nome"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/permissoes/perfis/{id}": {
            "put": {
                "tags": [
                    "Permissões"
                ],
                "operationId": "renomearPerfil",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Renomear perfil",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "nome": {
                                        "type": "string"
                                    },
                                    "descricao": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "nome"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            },
            "delete": {
                "tags": [
                    "Permissões"
                ],
                "operationId": "apagarPerfil",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Apagar perfil (sem pessoas e não base)",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    }
                }
            }
        },
        "/permissoes/pessoas": {
            "get": {
                "tags": [
                    "Permissões"
                ],
                "operationId": "permissoesPessoas",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Pessoas e respetivos perfis",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/permissoes/pessoas/{id}": {
            "get": {
                "tags": [
                    "Permissões"
                ],
                "operationId": "permissoesPessoa",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Permissões efetivas de uma pessoa",
                "description": "permissoes (módulo → {nivel, ambito, aprovar, exportar, origem perfil|cargo|delegacao|excecao|retirada|global|inativo, cargo_ambito}), cargo, departamento, equipas, delegações, exceções e editavel. Também em GET /permissoes/utilizadores/{id}.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/permissoes/pessoas/{id}/excecoes": {
            "get": {
                "tags": [
                    "Permissões"
                ],
                "operationId": "excecoesPessoa",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Exceções de permissão de uma pessoa",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "integer"
                                                    },
                                                    "modulo": {
                                                        "type": "string"
                                                    },
                                                    "tipo": {
                                                        "type": "string",
                                                        "enum": [
                                                            "conceder",
                                                            "retirar"
                                                        ]
                                                    },
                                                    "nivel": {
                                                        "type": "string"
                                                    },
                                                    "ambito": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "aprovar": {
                                                        "type": "boolean"
                                                    },
                                                    "exportar": {
                                                        "type": "boolean"
                                                    },
                                                    "inicio": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ],
                                                        "format": "date-time"
                                                    },
                                                    "fim": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ],
                                                        "format": "date-time"
                                                    },
                                                    "motivo": {
                                                        "type": "string"
                                                    },
                                                    "estado": {
                                                        "type": "string",
                                                        "enum": [
                                                            "ativa",
                                                            "agendada",
                                                            "expirada",
                                                            "revogada"
                                                        ]
                                                    },
                                                    "autor": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            },
            "post": {
                "tags": [
                    "Permissões"
                ],
                "operationId": "criarExcecao",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Conceder ou retirar um módulo/nível a uma pessoa",
                "description": "conceder: dá o nível (nunca acima do teto da família do perfil); retirar: o nível passa a no máximo o indicado (nenhum = sem o módulo) e aprovar/exportar = 1 retiram essas bandeiras. fim opcional; motivo obrigatório. Ninguém cria exceções para si; retirar termina as sessões da pessoa. Auditado.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "modulo": {
                                        "type": "string"
                                    },
                                    "tipo": {
                                        "type": "string",
                                        "enum": [
                                            "conceder",
                                            "retirar"
                                        ]
                                    },
                                    "nivel": {
                                        "type": "string",
                                        "enum": [
                                            "nenhum",
                                            "resumo",
                                            "ver",
                                            "editar"
                                        ]
                                    },
                                    "ambito": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "enum": [
                                            "proprios",
                                            "equipa",
                                            "departamento",
                                            "todos",
                                            null
                                        ]
                                    },
                                    "aprovar": {
                                        "type": "boolean"
                                    },
                                    "exportar": {
                                        "type": "boolean"
                                    },
                                    "fim": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date-time"
                                    },
                                    "motivo": {
                                        "type": "string",
                                        "minLength": 5,
                                        "maxLength": 255
                                    }
                                },
                                "required": [
                                    "modulo",
                                    "tipo",
                                    "nivel",
                                    "motivo"
                                ]
                            },
                            "example": {
                                "modulo": "indicadores.financeiros",
                                "tipo": "conceder",
                                "nivel": "ver",
                                "fim": "2026-11-30T23:59:00+00:00",
                                "motivo": "Substituição da diretora financeira durante as férias"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "excecoes": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/permissoes/utilizadores/{id}": {
            "get": {
                "tags": [
                    "Permissões"
                ],
                "operationId": "permissoesUtilizador",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Permissões efetivas de uma pessoa (alias)",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/permissoes/{perfil_id}": {
            "put": {
                "tags": [
                    "Permissões"
                ],
                "operationId": "gravarPerfilPermissoes",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Gravar as linhas de um perfil",
                "description": "Aceita {linhas:[…]} ou {modulos:{<módulo>:{nivel, ambito, aprovar, exportar}}} (formato da app).",
                "parameters": [
                    {
                        "name": "perfil_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "linhas": {
                                        "type": "array",
                                        "items": {
                                            "type": "object",
                                            "properties": {
                                                "modulo": {
                                                    "type": "string"
                                                },
                                                "nivel": {
                                                    "type": "string"
                                                },
                                                "ambito": {
                                                    "type": "string"
                                                },
                                                "aprovar": {
                                                    "type": "boolean"
                                                },
                                                "exportar": {
                                                    "type": "boolean"
                                                }
                                            }
                                        }
                                    },
                                    "modulos": {
                                        "type": "object"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "gravadas": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/permissoes/{perfil_id}/clonar": {
            "post": {
                "tags": [
                    "Permissões"
                ],
                "operationId": "clonarPerfilDe",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "perfil_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Clonar um perfil",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "nome": {
                                        "type": "string"
                                    },
                                    "descricao": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "nome"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/planos": {
            "get": {
                "tags": [
                    "Planos cirúrgicos"
                ],
                "operationId": "listarPlanos",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "resumo",
                "summary": "Listar planos",
                "description": "Planos no âmbito do utilizador. Quem tem só o nível «resumo» recebe o resumo autorizado (sem dados clínicos). Sem filtro de estado, as versões substituídas ficam de fora.",
                "parameters": [
                    {
                        "name": "paciente_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Paciente"
                    },
                    {
                        "name": "episodio_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Episódio"
                    },
                    {
                        "name": "estado",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "rascunho",
                                "em_revisao",
                                "aprovado",
                                "substituido"
                            ]
                        },
                        "description": "Estado"
                    },
                    {
                        "name": "pagina",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Página"
                    },
                    {
                        "name": "por_pagina",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "maximum": 100
                        },
                        "description": "Linhas por página"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/PlanoLinha"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 318,
                                            "paciente_id": 1204,
                                            "versao": 3,
                                            "estado": "em_revisao",
                                            "enxertos_necessarios": {
                                                "valor": 3200,
                                                "unidade": "enxertos"
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            },
            "post": {
                "tags": [
                    "Planos cirúrgicos"
                ],
                "operationId": "criarPlano",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "editar",
                "summary": "Criar plano",
                "description": "Cria um plano em rascunho com as zonas do diagrama (densidades sugeridas pela versão do motor) e a dadora (médias da tricoscopia, ou a área segura de referência). Escala, grau e PRECISE vêm da última consulta quando existe. Efeitos: linha do tempo, auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "paciente_id": {
                                        "type": "integer"
                                    },
                                    "episodio_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "tecnica": {
                                        "type": "string",
                                        "enum": [
                                            "FUE",
                                            "FUT",
                                            "DHI",
                                            "outra"
                                        ]
                                    }
                                },
                                "required": [
                                    "paciente_id"
                                ]
                            },
                            "example": {
                                "paciente_id": 1204,
                                "episodio_id": 77,
                                "tecnica": "FUE"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PlanoEditor"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/planos/conta-dadora/{paciente_id}": {
            "get": {
                "tags": [
                    "Planos cirúrgicos"
                ],
                "operationId": "contaDadora",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "ver",
                "summary": "Conta-corrente da reserva dadora",
                "description": "Capacidade ao longo da vida (plano aprovado mais recente) − enxertos extraídos em cada cirurgia fechada − reserva para perda futura = disponível; teto ao longo da vida.",
                "parameters": [
                    {
                        "name": "paciente_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ContaDadora"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/planos/proporcoes/{id}/decidir": {
            "post": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "decidirProporcoes",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "editar",
                "summary": "Aceitar, corrigir ou recusar os terços",
                "description": "Aceite ou corrigida → camada «Terços faciais» nos desenhos da fotografia (com ficha.fotografias editar).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "decisao": {
                                        "type": "string",
                                        "enum": [
                                            "aceite",
                                            "corrigida",
                                            "recusada"
                                        ]
                                    },
                                    "valores": {
                                        "type": "object",
                                        "properties": {
                                            "trichion": {
                                                "type": "number"
                                            },
                                            "glabela": {
                                                "type": "number"
                                            },
                                            "subnasal": {
                                                "type": "number"
                                            },
                                            "mento": {
                                                "type": "number"
                                            },
                                            "linha_media": {
                                                "type": "number"
                                            }
                                        }
                                    },
                                    "motivo": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "decisao"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "analise": {
                                                    "$ref": "#/components/schemas/AnaliseProporcoes"
                                                },
                                                "camada_id": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/planos/{id}": {
            "get": {
                "tags": [
                    "Planos cirúrgicos"
                ],
                "operationId": "obterPlano",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "resumo",
                "summary": "Obter o plano (editor ou resumo)",
                "description": "Com «ver»/«editar»: plano, zonas, dadoras, referências de densidade por zona, último resultado, versão do motor, versões, conta-corrente dadora, simulação, capturas e modelos 3D, médias da tricoscopia e permissões. Com «resumo»: {modo:\"resumo\", resumo}. Leitura auditada.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PlanoEditor"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            },
            "put": {
                "tags": [
                    "Planos cirúrgicos"
                ],
                "operationId": "gravarPlano",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "editar",
                "summary": "Gravar o rascunho (e recalcular)",
                "description": "Só em rascunho. Grava dados do plano, zonas e dadoras e o resultado recalculado. Áreas com origem «modelo3d» vêm do modelo no servidor; «diagrama» usa as áreas da cabeça padrão. Unidade errada → 422.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/EntradaCalculo"
                            },
                            "example": {
                                "plano": {
                                    "cenario": "provavel",
                                    "margem_pct": 0,
                                    "escala": "norwood",
                                    "grau": "V"
                                },
                                "zonas": [
                                    {
                                        "zona": "linha_frontal",
                                        "area_cm2": {
                                            "valor": 15,
                                            "unidade": "cm²"
                                        },
                                        "densidade_alvo": {
                                            "valor": 25,
                                            "unidade": "UF/cm²"
                                        },
                                        "origem_area": "manual",
                                        "incluida": true,
                                        "fase": 1
                                    },
                                    {
                                        "zona": "coroa",
                                        "area_cm2": 70,
                                        "densidade_alvo": 20,
                                        "origem_area": "modelo3d"
                                    }
                                ],
                                "dadoras": [
                                    {
                                        "subzona": "occipital",
                                        "area_cm2": 190,
                                        "densidade_uf_cm2": 75,
                                        "cabelos_por_uf": 2.1,
                                        "calibre_mm": 0.065,
                                        "extraidos_anteriores": 0
                                    }
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "resultado": {
                                                    "$ref": "#/components/schemas/ResultadoMotor"
                                                },
                                                "gravado": {
                                                    "type": "boolean"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "resultado": {
                                            "bloqueado": false,
                                            "motivos": [],
                                            "cenario": "provavel",
                                            "numeros": {
                                                "necessidade": {
                                                    "valor": 5625,
                                                    "unidade": "enxertos",
                                                    "min": 5344,
                                                    "max": 5907,
                                                    "formula": "N = Σ G × (1 + margem)",
                                                    "passos": [
                                                        "Linha frontal: 15 cm² × 25 UF/cm² = 375 enxertos",
                                                        "…",
                                                        "Soma das zonas: 5 625 enxertos"
                                                    ],
                                                    "parametros": [
                                                        {
                                                            "chave": "margem",
                                                            "nome": "Margem",
                                                            "valor": 0,
                                                            "unidade": "%",
                                                            "referencia": null,
                                                            "fonte": "sem fonte primária"
                                                        }
                                                    ],
                                                    "fonte": "Análise de referências e funcionalidades, secção 5 (27/10/2026)"
                                                },
                                                "residual_minima": {
                                                    "valor": 50,
                                                    "unidade": "UF/cm²",
                                                    "criterio": "cabelos"
                                                },
                                                "capacidade_vida": {
                                                    "valor": 4750,
                                                    "unidade": "enxertos",
                                                    "min": 4512,
                                                    "max": 4987
                                                },
                                                "capacidade_sessao": {
                                                    "valor": 2850,
                                                    "unidade": "enxertos"
                                                },
                                                "sessoes": {
                                                    "valor": 2,
                                                    "unidade": "sessões"
                                                },
                                                "balanco": {
                                                    "valor": -875,
                                                    "unidade": "enxertos",
                                                    "min": -1395,
                                                    "max": -357
                                                }
                                            },
                                            "plano_sessoes": [
                                                {
                                                    "sessao": 1,
                                                    "enxertos": {
                                                        "valor": 2850,
                                                        "unidade": "enxertos"
                                                    },
                                                    "densidade_antes": {
                                                        "valor": 75,
                                                        "unidade": "UF/cm²"
                                                    },
                                                    "densidade_depois": {
                                                        "valor": 60,
                                                        "unidade": "UF/cm²"
                                                    }
                                                },
                                                {
                                                    "sessao": 2,
                                                    "enxertos": {
                                                        "valor": 1900,
                                                        "unidade": "enxertos"
                                                    },
                                                    "densidade_antes": {
                                                        "valor": 60,
                                                        "unidade": "UF/cm²"
                                                    },
                                                    "densidade_depois": {
                                                        "valor": 50,
                                                        "unidade": "UF/cm²"
                                                    }
                                                }
                                            ],
                                            "propostas": [
                                                {
                                                    "codigo": "baixar_coroa",
                                                    "ordem": 1,
                                                    "efeito": {
                                                        "valor": 350,
                                                        "unidade": "enxertos"
                                                    },
                                                    "balanco_depois": {
                                                        "valor": -525,
                                                        "unidade": "enxertos"
                                                    },
                                                    "disponivel": true
                                                }
                                            ],
                                            "avisos": [
                                                {
                                                    "codigo": "limite_dador",
                                                    "nivel": "aviso",
                                                    "texto": "Défice de 875 enxertos face à capacidade dadora.",
                                                    "campo": null
                                                }
                                            ]
                                        },
                                        "gravado": true
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/planos/{id}/analise": {
            "get": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "analisePlano",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "ver",
                "summary": "Perda futura, expectativas, proporções faciais e cirurgia real",
                "description": "perda_futura: grau previsto (idade, história familiar, medicação, escala; regras da versão do motor), enxertos futuros pela tabela zona × grau e se a reserva dadora chega. expectativas: densidade natural vs esperada por zona, limiar da aparência normal e o texto aprovado. real: cabelos por enxerto medidos na última cirurgia.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/AnalisePlano"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/planos/{id}/aprovar": {
            "post": {
                "tags": [
                    "Planos cirúrgicos"
                ],
                "operationId": "aprovarPlano",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "aprovar",
                "summary": "Aprovar o plano (médico)",
                "description": "Exige «aprovar» em ficha.plano e uma versão do motor aprovada. Recalcula com essa versão, recusa se houver bloqueios, grava a impressão digital SHA-256 do JSON canónico (entrada + parâmetros + versão + resultado) e passa a aprovada anterior a «substituido». Se já havia consentimento cirúrgico assinado, devolve o aviso «renovar_consentimento» e cria tarefa para a enfermagem. Efeitos: linha do tempo, auditoria «aprovar», webhook plano.aprovado, jornada do episódio → proposta.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "plano": {
                                                    "$ref": "#/components/schemas/PlanoEditor"
                                                },
                                                "avisos": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/Aviso"
                                                    }
                                                },
                                                "impressao_digital": {
                                                    "type": "string"
                                                },
                                                "substituidos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "integer"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "impressao_digital": "b1946ac92492d2347c6235b4d2611184e7a4b8f3c2d1e0f9a8b7c6d5e4f3a2b1",
                                        "avisos": [],
                                        "substituidos": [
                                            311
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/planos/{id}/calcular": {
            "post": {
                "tags": [
                    "Planos cirúrgicos"
                ],
                "operationId": "calcularPlano",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "ver",
                "summary": "Calcular no servidor (fonte única dos números)",
                "description": "Corre o motor de cálculo com os valores enviados (ainda por gravar) sobre o plano gravado: necessidade, residual mínima, capacidade ao longo da vida e por sessão, sessões sessão a sessão, balanço, verificações PRECISE e Norwood, propostas para balanço negativo, alertas e bloqueios, e os três cenários. Cada número traz unidade, intervalo, fórmula, passo a passo, parâmetros e fonte. Com gravar:true grava (exige editar). O valor P só sai para quem vê valores de toda a clínica.",
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/EntradaCalculo"
                            },
                            "example": {
                                "plano": {
                                    "cenario": "provavel",
                                    "margem_pct": 0,
                                    "escala": "norwood",
                                    "grau": "V"
                                },
                                "zonas": [
                                    {
                                        "zona": "linha_frontal",
                                        "area_cm2": {
                                            "valor": 15,
                                            "unidade": "cm²"
                                        },
                                        "densidade_alvo": {
                                            "valor": 25,
                                            "unidade": "UF/cm²"
                                        },
                                        "origem_area": "manual",
                                        "incluida": true,
                                        "fase": 1
                                    },
                                    {
                                        "zona": "coroa",
                                        "area_cm2": 70,
                                        "densidade_alvo": 20,
                                        "origem_area": "modelo3d"
                                    }
                                ],
                                "dadoras": [
                                    {
                                        "subzona": "occipital",
                                        "area_cm2": 190,
                                        "densidade_uf_cm2": 75,
                                        "cabelos_por_uf": 2.1,
                                        "calibre_mm": 0.065,
                                        "extraidos_anteriores": 0
                                    }
                                ],
                                "gravar": false
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "resultado": {
                                                    "$ref": "#/components/schemas/ResultadoMotor"
                                                },
                                                "gravado": {
                                                    "type": "boolean"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "resultado": {
                                            "bloqueado": false,
                                            "motivos": [],
                                            "cenario": "provavel",
                                            "numeros": {
                                                "necessidade": {
                                                    "valor": 5625,
                                                    "unidade": "enxertos",
                                                    "min": 5344,
                                                    "max": 5907,
                                                    "formula": "N = Σ G × (1 + margem)",
                                                    "passos": [
                                                        "Linha frontal: 15 cm² × 25 UF/cm² = 375 enxertos",
                                                        "…",
                                                        "Soma das zonas: 5 625 enxertos"
                                                    ],
                                                    "parametros": [
                                                        {
                                                            "chave": "margem",
                                                            "nome": "Margem",
                                                            "valor": 0,
                                                            "unidade": "%",
                                                            "referencia": null,
                                                            "fonte": "sem fonte primária"
                                                        }
                                                    ],
                                                    "fonte": "Análise de referências e funcionalidades, secção 5 (27/10/2026)"
                                                },
                                                "residual_minima": {
                                                    "valor": 50,
                                                    "unidade": "UF/cm²",
                                                    "criterio": "cabelos"
                                                },
                                                "capacidade_vida": {
                                                    "valor": 4750,
                                                    "unidade": "enxertos",
                                                    "min": 4512,
                                                    "max": 4987
                                                },
                                                "capacidade_sessao": {
                                                    "valor": 2850,
                                                    "unidade": "enxertos"
                                                },
                                                "sessoes": {
                                                    "valor": 2,
                                                    "unidade": "sessões"
                                                },
                                                "balanco": {
                                                    "valor": -875,
                                                    "unidade": "enxertos",
                                                    "min": -1395,
                                                    "max": -357
                                                }
                                            },
                                            "plano_sessoes": [
                                                {
                                                    "sessao": 1,
                                                    "enxertos": {
                                                        "valor": 2850,
                                                        "unidade": "enxertos"
                                                    },
                                                    "densidade_antes": {
                                                        "valor": 75,
                                                        "unidade": "UF/cm²"
                                                    },
                                                    "densidade_depois": {
                                                        "valor": 60,
                                                        "unidade": "UF/cm²"
                                                    }
                                                },
                                                {
                                                    "sessao": 2,
                                                    "enxertos": {
                                                        "valor": 1900,
                                                        "unidade": "enxertos"
                                                    },
                                                    "densidade_antes": {
                                                        "valor": 60,
                                                        "unidade": "UF/cm²"
                                                    },
                                                    "densidade_depois": {
                                                        "valor": 50,
                                                        "unidade": "UF/cm²"
                                                    }
                                                }
                                            ],
                                            "propostas": [
                                                {
                                                    "codigo": "baixar_coroa",
                                                    "ordem": 1,
                                                    "efeito": {
                                                        "valor": 350,
                                                        "unidade": "enxertos"
                                                    },
                                                    "balanco_depois": {
                                                        "valor": -525,
                                                        "unidade": "enxertos"
                                                    },
                                                    "disponivel": true
                                                }
                                            ],
                                            "avisos": [
                                                {
                                                    "codigo": "limite_dador",
                                                    "nivel": "aviso",
                                                    "texto": "Défice de 875 enxertos face à capacidade dadora.",
                                                    "campo": null
                                                }
                                            ]
                                        },
                                        "gravado": false
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/planos/{id}/comparar": {
            "post": {
                "tags": [
                    "Planos cirúrgicos"
                ],
                "operationId": "compararEnxertos",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "ver",
                "summary": "Comparar números de enxertos",
                "description": "Para N enxertos: cobertura da necessidade, densidade por zona, sessões e o que sobra na dadora; indisponível (com razão) acima da capacidade.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "enxertos": {
                                        "type": "integer",
                                        "minimum": 0,
                                        "maximum": 20000
                                    },
                                    "estado": {
                                        "$ref": "#/components/schemas/EntradaCalculo"
                                    }
                                },
                                "required": [
                                    "enxertos"
                                ]
                            },
                            "example": {
                                "enxertos": 2500
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Comparacao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "enxertos": {
                                            "valor": 2500,
                                            "unidade": "enxertos"
                                        },
                                        "cobertura": {
                                            "valor": 44.4,
                                            "unidade": "%"
                                        },
                                        "sessoes": {
                                            "valor": 1,
                                            "unidade": "sessões"
                                        },
                                        "disponivel": true
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/planos/{id}/diferencas": {
            "get": {
                "tags": [
                    "Planos cirúrgicos"
                ],
                "operationId": "diferencasPlano",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "ver",
                "summary": "Diferenças entre versões",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "name": "com",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Outra versão do mesmo plano"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "a": {
                                                    "type": "object"
                                                },
                                                "b": {
                                                    "type": "object"
                                                },
                                                "diferencas": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "grupo": {
                                                                "type": "string"
                                                            },
                                                            "rotulo": {
                                                                "type": "string"
                                                            },
                                                            "antes": [],
                                                            "depois": [],
                                                            "unidade": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/planos/{id}/expectativas/mostradas": {
            "post": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "expectativasMostradas",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "editar",
                "summary": "Registar a comparação mostrada ao paciente",
                "description": "Guarda quem, quando, o canal e o SHA-256 exato do que foi mostrado. Só com o texto aprovado (versão do motor aprovada).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "canal": {
                                        "type": "string",
                                        "enum": [
                                            "presencial",
                                            "teleconsulta",
                                            "portal"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "canal": "presencial"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/AnalisePlano"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/planos/{id}/perda-futura": {
            "post": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "historiaFamiliarPlano",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "editar",
                "summary": "História familiar (sim, não ou desconhecida)",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "historia_familiar": {
                                        "type": [
                                            "boolean",
                                            "null"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "historia_familiar": true
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/AnalisePlano"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/planos/{id}/proporcoes": {
            "post": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "proporcoesFaciais",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "editar",
                "summary": "Propor os terços faciais numa fotografia de frente",
                "description": "Proposta da IA de visão (uso proporcoes; exige o consentimento «ia»; precisa do rosto, por isso não passa pela desfocagem). Pendente até decisão.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "foto_id": {
                                        "type": "integer"
                                    }
                                },
                                "required": [
                                    "foto_id"
                                ]
                            },
                            "example": {
                                "foto_id": 3321
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/AnaliseProporcoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/planos/{id}/proposta": {
            "post": {
                "tags": [
                    "Planos cirúrgicos"
                ],
                "operationId": "criarPropostaDoPlano",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "editar",
                "summary": "Criar a proposta a partir do plano aprovado",
                "description": "Só para planos aprovados; usa o serviço comercial (Comercial\\Propostas::criarDoPlano). 422 se o módulo comercial não existir.",
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "proposta_id": {
                                                    "type": "integer"
                                                },
                                                "ligacao": {
                                                    "type": "object"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "proposta_id": 91,
                                        "ligacao": {
                                            "web": "equipa/r/propostas/91",
                                            "app": "/r/propostas/91"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/planos/{id}/simulacao": {
            "post": {
                "tags": [
                    "Planos cirúrgicos"
                ],
                "operationId": "carregarSimulacao",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "editar",
                "summary": "Carregar a imagem simulada",
                "description": "Imagem validada pelo conteúdo, guardada cifrada e marcada «simulação» (nunca utilizável em marketing). Repõe «mostrada» e «tomada de conhecimento».",
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ficheiro"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Simulacao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/planos/{id}/simulacao-ia": {
            "get": {
                "tags": [
                    "Planos cirúrgicos"
                ],
                "operationId": "simulacaoIaEstado",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "ver",
                "summary": "Simulação gerada pela IA: estado, fotografias de base e imagens",
                "description": "Só a equipa. Diz se a geração está configurada, se o paciente deu o consentimento «ia», se o rosto pode seguir visível (consentimento + opção da clínica), os três cenários, as fotografias de frente/topo que servem de base e as imagens geradas (mais recentes primeiro) com o estado da validação.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/SimulacaoIaEstado"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/planos/{id}/simulacao-ia/gerar": {
            "post": {
                "tags": [
                    "Planos cirúrgicos"
                ],
                "operationId": "simulacaoIaGerar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "editar",
                "x-anagen-limite": "12 pedidos / 10 min",
                "summary": "Gerar a simulação de um cenário a partir de uma fotografia",
                "description": "Uma imagem por pedido (pode levar minutos). Exige o consentimento «ia»; o rosto é desfocado antes do envio (salvo consentimento + opção da clínica); IA de imagem do uso «simulacao» (serviço local primeiro, externo como recurso só com o interruptor dos dados de pacientes); a imagem tem de partir da fotografia (semelhança ≥ 50 %). Guardada como ficheiro clínico cifrado e fotografia «simulação», com a marca visível gravada; fica «por_validar». 422 com o motivo quando não pode gerar.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "cenario": {
                                        "type": "string",
                                        "enum": [
                                            "conservador",
                                            "provavel",
                                            "agressivo"
                                        ]
                                    },
                                    "foto_id": {
                                        "type": "integer"
                                    }
                                },
                                "required": [
                                    "cenario",
                                    "foto_id"
                                ]
                            },
                            "example": {
                                "cenario": "provavel",
                                "foto_id": 5521
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/SimulacaoIaEstado"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/planos/{id}/simulacao-ia/video": {
            "post": {
                "tags": [
                    "Planos cirúrgicos"
                ],
                "operationId": "simulacaoIaVideo",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "ver",
                "summary": "Registar a exportação do vídeo da simulação",
                "description": "O vídeo (antes/depois ou rotação do modelo 3D) é gravado no aparelho e nunca passa pelo servidor; este pedido só o regista na auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "origem": {
                                        "type": "string",
                                        "enum": [
                                            "antes_depois",
                                            "modelo3d",
                                            "animacao_app"
                                        ]
                                    },
                                    "formato": {
                                        "type": "string",
                                        "enum": [
                                            "webm",
                                            "mp4",
                                            "animacao"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "origem": "antes_depois",
                                "formato": "webm"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "registado": {
                                                    "type": "boolean"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/planos/{id}/simulacao/conhecimento": {
            "post": {
                "tags": [
                    "Planos cirúrgicos"
                ],
                "operationId": "simulacaoConhecimento",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "paciente": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "editar",
                "summary": "Tomada de conhecimento do aviso da simulação",
                "description": "Equipa: registo presencial (editar ficha.plano). Paciente (portal/app): só o próprio plano aprovado; canal «portal» ou «app». Auditoria «assinar» com o texto do aviso e o SHA-256 da imagem.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "canal": {
                                        "type": "string",
                                        "enum": [
                                            "presencial",
                                            "portal",
                                            "app"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "canal": "app"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Simulacao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/planos/{id}/simulacao/mostrada": {
            "post": {
                "tags": [
                    "Planos cirúrgicos"
                ],
                "operationId": "simulacaoMostrada",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "editar",
                "summary": "Registar que a simulação foi mostrada",
                "description": "Plano aprovado. Confere o SHA-256 da imagem (versão exata arquivada) e regista quem mostrou e quando.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Simulacao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/planos/{id}/submeter": {
            "post": {
                "tags": [
                    "Planos cirúrgicos"
                ],
                "operationId": "submeterPlano",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "editar",
                "summary": "Submeter para revisão médica",
                "description": "Recalcula e grava; recusa (422) se houver bloqueios. O rascunho passa a «em revisão» (congelado) e o médico do paciente é notificado.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PlanoEditor"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/planos/{id}/usar-real": {
            "post": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "usarRealNoPlano",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "editar",
                "summary": "Usar os cabelos por enxerto reais no rascunho",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "plano_id": {
                                                    "type": "integer"
                                                },
                                                "subzonas": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "resultado": {
                                                    "$ref": "#/components/schemas/ResultadoMotor"
                                                },
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/planos/{id}/versao": {
            "post": {
                "tags": [
                    "Planos cirúrgicos"
                ],
                "operationId": "novaVersaoPlano",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "editar",
                "summary": "Nova versão (cópia editável)",
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PlanoEditor"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/plataforma/apresentacao/blocos": {
            "get": {
                "summary": "Blocos da Apresentação do AnagenSys",
                "description": "Reservado à gestão do produto (403 para as contas das clínicas). Os dados vivem sempre na clínica principal. meta.paginas traz o estado de publicação em pt e en.",
                "parameters": [
                    {
                        "name": "idioma",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "pt",
                                "en"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/SiteBloco"
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "idioma": {
                                                    "type": "string"
                                                },
                                                "paginas": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "integer"
                                                            },
                                                            "idioma": {
                                                                "type": "string"
                                                            },
                                                            "publicada": {
                                                                "type": "boolean"
                                                            },
                                                            "versao": {
                                                                "type": "integer"
                                                            },
                                                            "publicada_em": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ],
                                                                "format": "date-time"
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 214,
                                            "pagina": "apresentacao",
                                            "chave": "hero_titulo",
                                            "idioma": "pt",
                                            "tipo": "texto",
                                            "seccao": "hero",
                                            "rotulo": "Título principal",
                                            "ajuda": "Use *asteriscos* para o itálico.",
                                            "valor": "Da primeira mensagem ao resultado aos 18 meses, *num só sistema*.",
                                            "campos": null,
                                            "imagem": null,
                                            "personalizado": false,
                                            "atualizado_em": "2026-10-28 11:20:00",
                                            "ordem": 1
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Plataforma — Apresentação"
                ],
                "operationId": "plataformaApresentacaoBlocos",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.apresentacao",
                "x-anagen-nivel": "plataforma"
            },
            "put": {
                "summary": "Gravar um bloco da Apresentação",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "chave": {
                                        "type": "string"
                                    },
                                    "idioma": {
                                        "type": "string",
                                        "enum": [
                                            "pt",
                                            "en"
                                        ]
                                    },
                                    "valor": {
                                        "description": "Conforme o tipo do bloco."
                                    },
                                    "ficheiro_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "chave",
                                    "idioma"
                                ]
                            },
                            "example": {
                                "chave": "hero_nota",
                                "idioma": "pt",
                                "valor": "Demonstração de 45 minutos com a equipa do produto."
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/SiteBloco"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 214,
                                        "pagina": "apresentacao",
                                        "chave": "hero_nota",
                                        "idioma": "pt",
                                        "tipo": "texto",
                                        "seccao": "hero",
                                        "rotulo": "Título principal",
                                        "ajuda": "Use *asteriscos* para o itálico.",
                                        "valor": "Demonstração de 45 minutos com a equipa do produto.",
                                        "campos": null,
                                        "imagem": null,
                                        "personalizado": true,
                                        "atualizado_em": "2026-10-28 11:20:00",
                                        "ordem": 1
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Plataforma — Apresentação"
                ],
                "operationId": "plataformaApresentacaoGuardarBloco",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.apresentacao",
                "x-anagen-nivel": "plataforma"
            }
        },
        "/plataforma/apresentacao/blocos/repor": {
            "post": {
                "summary": "Repor um bloco da Apresentação",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "chave": {
                                        "type": "string"
                                    },
                                    "idioma": {
                                        "type": "string",
                                        "enum": [
                                            "pt",
                                            "en"
                                        ]
                                    }
                                },
                                "required": [
                                    "chave",
                                    "idioma"
                                ]
                            },
                            "example": {
                                "chave": "hero_nota",
                                "idioma": "pt"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/SiteBloco"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 214,
                                        "pagina": "apresentacao",
                                        "chave": "hero_nota",
                                        "idioma": "pt",
                                        "tipo": "texto",
                                        "seccao": "hero",
                                        "rotulo": "Título principal",
                                        "ajuda": "Use *asteriscos* para o itálico.",
                                        "valor": "Cabelo natural, *plano transparente*.",
                                        "campos": null,
                                        "imagem": null,
                                        "personalizado": false,
                                        "atualizado_em": "2026-10-28 11:20:00",
                                        "ordem": 1
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Plataforma — Apresentação"
                ],
                "operationId": "plataformaApresentacaoReporBloco",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.apresentacao",
                "x-anagen-nivel": "plataforma"
            }
        },
        "/plataforma/apresentacao/definicoes": {
            "get": {
                "summary": "Definições da Apresentação",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "email_notificacao": {
                                                    "type": "string"
                                                },
                                                "dominio": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "email_notificacao": "produto@anagen.pt",
                                        "dominio": "https://anagen.pt"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Plataforma — Apresentação"
                ],
                "operationId": "plataformaApresentacaoDefinicoes",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.apresentacao",
                "x-anagen-nivel": "plataforma"
            },
            "put": {
                "summary": "Gravar as definições da Apresentação",
                "description": "email_notificacao recebe cada pedido de demonstração; dominio é o endereço principal (https:// sem caminho) para onde são reencaminhados os acessos por outros domínios. Alteração auditada.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "email_notificacao": {
                                        "type": "string",
                                        "format": "email"
                                    },
                                    "dominio": {
                                        "type": "string",
                                        "pattern": "^https://[a-z0-9.-]+$"
                                    }
                                }
                            },
                            "example": {
                                "email_notificacao": "produto@anagen.pt",
                                "dominio": "https://anagen.pt"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "email_notificacao": {
                                                    "type": "string"
                                                },
                                                "dominio": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "email_notificacao": "produto@anagen.pt",
                                        "dominio": "https://anagen.pt"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Plataforma — Apresentação"
                ],
                "operationId": "plataformaApresentacaoGravarDefinicoes",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.apresentacao",
                "x-anagen-nivel": "plataforma"
            }
        },
        "/plataforma/apresentacao/imagens": {
            "get": {
                "summary": "Biblioteca de imagens da Apresentação",
                "description": "Imagens da clínica principal usadas na Apresentação (por exemplo, a imagem de partilha nas redes).",
                "parameters": [
                    {
                        "name": "q",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "maxLength": 100
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/SiteImagem"
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 37,
                                            "nome": "9f1c2a7e4b0d4c1e8a3f6b2d5c7e9a10.webp",
                                            "url": "https://clinica.exemplo.pt/uploads/site/c1/9f1c2a7e4b0d4c1e8a3f6b2d5c7e9a10.webp",
                                            "mime": "image/webp",
                                            "largura": 2400,
                                            "altura": 1600,
                                            "tamanho": 318422,
                                            "alt_pt": "Sala de consulta da clínica",
                                            "alt_en": "The clinic's consultation room",
                                            "usos": 2,
                                            "criado_em": "2026-10-28T09:12:00+00:00"
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Plataforma — Apresentação"
                ],
                "operationId": "plataformaApresentacaoImagens",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.apresentacao",
                "x-anagen-nivel": "plataforma"
            },
            "post": {
                "summary": "Carregar uma imagem para a Apresentação",
                "description": "Multipart, com as mesmas verificações do CMS (bytes, dimensões, reescrita sem metadados, nome aleatório). Limite: 60 por 10 minutos.",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ficheiro"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary"
                                    },
                                    "alt_pt": {
                                        "type": "string",
                                        "maxLength": 255
                                    },
                                    "alt_en": {
                                        "type": "string",
                                        "maxLength": 255
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/SiteImagem"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 37,
                                        "nome": "9f1c2a7e4b0d4c1e8a3f6b2d5c7e9a10.webp",
                                        "url": "https://clinica.exemplo.pt/uploads/site/c1/9f1c2a7e4b0d4c1e8a3f6b2d5c7e9a10.webp",
                                        "mime": "image/webp",
                                        "largura": 2400,
                                        "altura": 1600,
                                        "tamanho": 318422,
                                        "alt_pt": "Sala de consulta da clínica",
                                        "alt_en": "The clinic's consultation room",
                                        "usos": 2,
                                        "criado_em": "2026-10-28T09:12:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Plataforma — Apresentação"
                ],
                "operationId": "plataformaApresentacaoCarregarImagem",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.apresentacao",
                "x-anagen-nivel": "plataforma"
            }
        },
        "/plataforma/apresentacao/imagens/{id}": {
            "delete": {
                "summary": "Apagar uma imagem sem utilizações",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Identificador"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "apagada": {
                                                    "type": "boolean"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 37,
                                        "apagada": true
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Plataforma — Apresentação"
                ],
                "operationId": "plataformaApresentacaoApagarImagem",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.apresentacao",
                "x-anagen-nivel": "plataforma"
            }
        },
        "/plataforma/apresentacao/pedidos": {
            "get": {
                "summary": "Quadro dos pedidos de demonstração",
                "description": "Colunas por estado (novo, contactado, demonstração marcada, proposta, cliente, sem seguimento, arquivado), pela ordem do quadro.",
                "parameters": [
                    {
                        "name": "q",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "maxLength": 100
                        },
                        "description": "Procura no nome, clínica e email."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "colunas": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "estado": {
                                                                "type": "string"
                                                            },
                                                            "titulo": {
                                                                "type": "string"
                                                            },
                                                            "tom": {
                                                                "type": "string"
                                                            },
                                                            "cartoes": {
                                                                "type": "array",
                                                                "items": {
                                                                    "$ref": "#/components/schemas/ApresentacaoPedidoCartao"
                                                                }
                                                            }
                                                        }
                                                    }
                                                },
                                                "total": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "colunas": [
                                            {
                                                "estado": "demonstracao_marcada",
                                                "titulo": "Demonstração marcada",
                                                "tom": "marca",
                                                "cartoes": [
                                                    {
                                                        "id": 58,
                                                        "nome": "Marta Ribeiro",
                                                        "clinica_nome": "Clínica Capilar do Norte",
                                                        "especialidade": "capilar",
                                                        "especialidade_rotulo": "Cirurgia capilar",
                                                        "pais": "PT",
                                                        "cirurgias_mes": 24,
                                                        "estado": "demonstracao_marcada",
                                                        "estado_rotulo": "Demonstração marcada",
                                                        "tom": "marca",
                                                        "responsavel_id": 3,
                                                        "responsavel_nome": "Pedro Almeida",
                                                        "demonstracao_em": "2026-11-05T15:00:00+00:00",
                                                        "criado_em": "2026-10-27T18:40:00+00:00",
                                                        "ordem": 0
                                                    }
                                                ]
                                            }
                                        ],
                                        "total": 1
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Plataforma — Apresentação"
                ],
                "operationId": "plataformaPedidosQuadro",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.apresentacao",
                "x-anagen-nivel": "plataforma"
            }
        },
        "/plataforma/apresentacao/pedidos/{id}": {
            "get": {
                "summary": "Um pedido de demonstração",
                "description": "Leitura auditada.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Identificador"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ApresentacaoPedido"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 58,
                                        "nome": "Marta Ribeiro",
                                        "clinica_nome": "Clínica Capilar do Norte",
                                        "especialidade": "capilar",
                                        "especialidade_rotulo": "Cirurgia capilar",
                                        "pais": "PT",
                                        "cirurgias_mes": 24,
                                        "estado": "demonstracao_marcada",
                                        "estado_rotulo": "Demonstração marcada",
                                        "tom": "marca",
                                        "responsavel_id": 3,
                                        "responsavel_nome": "Pedro Almeida",
                                        "demonstracao_em": "2026-11-05T15:00:00+00:00",
                                        "criado_em": "2026-10-27T18:40:00+00:00",
                                        "ordem": 0,
                                        "cargo": "Diretora clínica",
                                        "email": "marta@capilarnorte.pt",
                                        "telefone": "+351 912 345 678",
                                        "cirurgioes_n": 2,
                                        "sistemas_atuais": "Agenda em folha de cálculo e um programa de faturação",
                                        "mensagem": "Gostaríamos de ver o planeamento e o portal do paciente.",
                                        "idioma": "pt",
                                        "origem": "site",
                                        "utm": {
                                            "source": "linkedin",
                                            "campaign": "outono"
                                        },
                                        "consentimento_em": "2026-10-27T18:40:00+00:00",
                                        "notas": "Ligar depois das 17h.",
                                        "responsaveis": [
                                            {
                                                "id": 3,
                                                "nome": "Pedro Almeida"
                                            }
                                        ],
                                        "estados": [
                                            {
                                                "valor": "novo",
                                                "rotulo": "Novo"
                                            },
                                            {
                                                "valor": "contactado",
                                                "rotulo": "Contactado"
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Plataforma — Apresentação"
                ],
                "operationId": "plataformaPedido",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.apresentacao",
                "x-anagen-nivel": "plataforma"
            },
            "put": {
                "summary": "Atualizar um pedido",
                "description": "Campos parciais: estado, responsavel_id, demonstracao_em, notas e dados de contacto. Marcar a demonstração num pedido «novo» ou «contactado» passa-o a «demonstracao_marcada». Alteração auditada.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Identificador"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "estado": {
                                        "type": "string",
                                        "enum": [
                                            "novo",
                                            "contactado",
                                            "demonstracao_marcada",
                                            "proposta",
                                            "ganho",
                                            "perdido",
                                            "arquivado"
                                        ]
                                    },
                                    "responsavel_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "demonstracao_em": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date-time"
                                    },
                                    "notas": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "maxLength": 8000
                                    }
                                }
                            },
                            "example": {
                                "responsavel_id": 3,
                                "demonstracao_em": "2026-11-05T15:00:00+00:00",
                                "notas": "Ligar depois das 17h."
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ApresentacaoPedido"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 58,
                                        "nome": "Marta Ribeiro",
                                        "clinica_nome": "Clínica Capilar do Norte",
                                        "especialidade": "capilar",
                                        "especialidade_rotulo": "Cirurgia capilar",
                                        "pais": "PT",
                                        "cirurgias_mes": 24,
                                        "estado": "demonstracao_marcada",
                                        "estado_rotulo": "Demonstração marcada",
                                        "tom": "marca",
                                        "responsavel_id": 3,
                                        "responsavel_nome": "Pedro Almeida",
                                        "demonstracao_em": "2026-11-05T15:00:00+00:00",
                                        "criado_em": "2026-10-27T18:40:00+00:00",
                                        "ordem": 0,
                                        "cargo": "Diretora clínica",
                                        "email": "marta@capilarnorte.pt",
                                        "telefone": "+351 912 345 678",
                                        "cirurgioes_n": 2,
                                        "sistemas_atuais": "Agenda em folha de cálculo e um programa de faturação",
                                        "mensagem": "Gostaríamos de ver o planeamento e o portal do paciente.",
                                        "idioma": "pt",
                                        "origem": "site",
                                        "utm": {
                                            "source": "linkedin",
                                            "campaign": "outono"
                                        },
                                        "consentimento_em": "2026-10-27T18:40:00+00:00",
                                        "notas": "Ligar depois das 17h.",
                                        "responsaveis": [
                                            {
                                                "id": 3,
                                                "nome": "Pedro Almeida"
                                            }
                                        ],
                                        "estados": [
                                            {
                                                "valor": "novo",
                                                "rotulo": "Novo"
                                            },
                                            {
                                                "valor": "contactado",
                                                "rotulo": "Contactado"
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Plataforma — Apresentação"
                ],
                "operationId": "plataformaAtualizarPedido",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.apresentacao",
                "x-anagen-nivel": "plataforma"
            }
        },
        "/plataforma/apresentacao/pedidos/{id}/mover": {
            "post": {
                "summary": "Mover um pedido no quadro",
                "description": "Muda o estado e a posição (ordem a partir de 0); a coluna de destino é renumerada.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Identificador"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "estado": {
                                        "type": "string",
                                        "enum": [
                                            "novo",
                                            "contactado",
                                            "demonstracao_marcada",
                                            "proposta",
                                            "ganho",
                                            "perdido",
                                            "arquivado"
                                        ]
                                    },
                                    "ordem": {
                                        "type": "integer",
                                        "minimum": 0
                                    }
                                },
                                "required": [
                                    "estado"
                                ]
                            },
                            "example": {
                                "estado": "proposta",
                                "ordem": 0
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ApresentacaoPedido"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 58,
                                        "nome": "Marta Ribeiro",
                                        "clinica_nome": "Clínica Capilar do Norte",
                                        "especialidade": "capilar",
                                        "especialidade_rotulo": "Cirurgia capilar",
                                        "pais": "PT",
                                        "cirurgias_mes": 24,
                                        "estado": "proposta",
                                        "estado_rotulo": "Proposta enviada",
                                        "tom": "ouro",
                                        "responsavel_id": 3,
                                        "responsavel_nome": "Pedro Almeida",
                                        "demonstracao_em": "2026-11-05T15:00:00+00:00",
                                        "criado_em": "2026-10-27T18:40:00+00:00",
                                        "ordem": 0,
                                        "cargo": "Diretora clínica",
                                        "email": "marta@capilarnorte.pt",
                                        "telefone": "+351 912 345 678",
                                        "cirurgioes_n": 2,
                                        "sistemas_atuais": "Agenda em folha de cálculo e um programa de faturação",
                                        "mensagem": "Gostaríamos de ver o planeamento e o portal do paciente.",
                                        "idioma": "pt",
                                        "origem": "site",
                                        "utm": {
                                            "source": "linkedin",
                                            "campaign": "outono"
                                        },
                                        "consentimento_em": "2026-10-27T18:40:00+00:00",
                                        "notas": "Ligar depois das 17h.",
                                        "responsaveis": [
                                            {
                                                "id": 3,
                                                "nome": "Pedro Almeida"
                                            }
                                        ],
                                        "estados": [
                                            {
                                                "valor": "novo",
                                                "rotulo": "Novo"
                                            },
                                            {
                                                "valor": "contactado",
                                                "rotulo": "Contactado"
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Plataforma — Apresentação"
                ],
                "operationId": "plataformaMoverPedido",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.apresentacao",
                "x-anagen-nivel": "plataforma"
            }
        },
        "/plataforma/apresentacao/publicar": {
            "post": {
                "summary": "Publicar ou retirar a Apresentação numa língua",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "idioma": {
                                        "type": "string",
                                        "enum": [
                                            "pt",
                                            "en"
                                        ]
                                    },
                                    "publicar": {
                                        "type": "boolean"
                                    },
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "maxLength": 255
                                    }
                                },
                                "required": [
                                    "idioma"
                                ]
                            },
                            "example": {
                                "idioma": "en",
                                "publicar": true,
                                "motivo": "Nova secção de integrações"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "publicada": {
                                                    "type": "boolean"
                                                },
                                                "versao": {
                                                    "type": "integer"
                                                },
                                                "publicada_em": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "publicada": true,
                                        "versao": 5,
                                        "publicada_em": "2026-10-28T12:40:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Plataforma — Apresentação"
                ],
                "operationId": "plataformaApresentacaoPublicar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.apresentacao",
                "x-anagen-nivel": "plataforma"
            }
        },
        "/plataforma/operacao": {
            "get": {
                "tags": [
                    "Operação da plataforma"
                ],
                "operationId": "estadoDaPlataforma",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.operacao",
                "x-anagen-nivel": "ver",
                "summary": "Estado da plataforma",
                "description": "Pontos de atenção ordenados pela gravidade, ambiente, cópias, restauros, vulnerabilidades, dependências, alojamento, security.txt e versões. Reservado aos superadministradores da plataforma (403 so_superadmin / segundo_fator_necessario para todos os outros, incluindo administradores de clínica).",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EstadoPlataforma"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/plataforma/operacao/atividades": {
            "get": {
                "tags": [
                    "Operação da plataforma"
                ],
                "operationId": "listarAtividadesOperacao",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.operacao",
                "x-anagen-nivel": "ver",
                "summary": "Testes de intrusão, exercícios e revisões",
                "description": " Reservado aos superadministradores da plataforma (403 so_superadmin / segundo_fator_necessario para todos os outros, incluindo administradores de clínica).",
                "parameters": [
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "teste_intrusao",
                                "exercicio_continuidade",
                                "teste_restauro_manual",
                                "revisao_dependencias",
                                "revisao_asvs",
                                "revisao_acessos",
                                "outro"
                            ]
                        }
                    },
                    {
                        "name": "pagina",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/AtividadeOperacao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            },
            "post": {
                "tags": [
                    "Operação da plataforma"
                ],
                "operationId": "criarAtividadeOperacao",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.operacao",
                "x-anagen-nivel": "editar",
                "summary": "Registar uma atividade",
                "description": "n_<gravidade> = número de constatações por gravidade (testes e revisões); rpo_minutos/rto_minutos medidos (exercícios). Sem proxima_em: intrusão +12 meses (Definições), exercício +6, revisão de dependências +1, ASVS +12, acessos +3. Reservado aos superadministradores da plataforma (403 so_superadmin / segundo_fator_necessario para todos os outros, incluindo administradores de clínica).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "tipo": {
                                        "type": "string",
                                        "enum": [
                                            "teste_intrusao",
                                            "exercicio_continuidade",
                                            "teste_restauro_manual",
                                            "revisao_dependencias",
                                            "revisao_asvs",
                                            "revisao_acessos",
                                            "outro"
                                        ]
                                    },
                                    "titulo": {
                                        "type": "string",
                                        "maxLength": 255
                                    },
                                    "realizada_em": {
                                        "type": "string",
                                        "format": "date"
                                    },
                                    "resultado": {
                                        "type": "string",
                                        "enum": [
                                            "sem_constatacoes",
                                            "com_constatacoes",
                                            "parcial",
                                            "falhou",
                                            "concluido"
                                        ]
                                    },
                                    "entidade": {
                                        "type": "string",
                                        "maxLength": 190
                                    },
                                    "ambito": {
                                        "type": "string",
                                        "maxLength": 500
                                    },
                                    "proxima_em": {
                                        "type": "string",
                                        "format": "date"
                                    },
                                    "n_critica": {
                                        "type": "integer"
                                    },
                                    "n_alta": {
                                        "type": "integer"
                                    },
                                    "n_media": {
                                        "type": "integer"
                                    },
                                    "n_baixa": {
                                        "type": "integer"
                                    },
                                    "n_info": {
                                        "type": "integer"
                                    },
                                    "rpo_minutos": {
                                        "type": "integer"
                                    },
                                    "rto_minutos": {
                                        "type": "integer"
                                    },
                                    "notas": {
                                        "type": "string",
                                        "maxLength": 5000
                                    }
                                },
                                "required": [
                                    "tipo",
                                    "titulo",
                                    "realizada_em",
                                    "resultado"
                                ]
                            },
                            "example": {
                                "tipo": "exercicio_continuidade",
                                "titulo": "Restauro completo num servidor novo",
                                "realizada_em": "2026-10-29",
                                "resultado": "concluido",
                                "rpo_minutos": 1440,
                                "rto_minutos": 210
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/AtividadeOperacao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/plataforma/operacao/copias": {
            "get": {
                "tags": [
                    "Operação da plataforma"
                ],
                "operationId": "listarCopias",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.operacao",
                "x-anagen-nivel": "ver",
                "summary": "Cópias de segurança",
                "description": " Reservado aos superadministradores da plataforma (403 so_superadmin / segundo_fator_necessario para todos os outros, incluindo administradores de clínica).",
                "parameters": [
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "pedida",
                                "em_curso",
                                "ok",
                                "erro"
                            ]
                        }
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "diaria",
                                "semanal",
                                "mensal",
                                "manual"
                            ]
                        }
                    },
                    {
                        "name": "pagina",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "por_pagina",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "maximum": 100
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/CopiaSeguranca"
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "pagina": {
                                                    "type": "integer"
                                                },
                                                "por_pagina": {
                                                    "type": "integer"
                                                },
                                                "total": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 214,
                                            "origem": "automatica",
                                            "origem_rotulo": "automática",
                                            "tipo": "diaria",
                                            "tipo_rotulo": "Diária",
                                            "estado": "ok",
                                            "estado_rotulo": "Concluída",
                                            "estado_tom": "sucesso",
                                            "iniciada_em": "2026-10-29T02:30:04+00:00",
                                            "terminada_em": "2026-10-29T02:41:52+00:00",
                                            "duracao_legivel": "11 min 48 s",
                                            "nome": "anagensys-20261029-023004-diaria-214.axc",
                                            "tamanho": 1873420288,
                                            "tamanho_legivel": "1,7 GB",
                                            "sha256": "9b1e…c04f",
                                            "metodo_dump": "binario",
                                            "base_dados": {
                                                "tabelas": 186,
                                                "linhas": 2410377,
                                                "bytes": 402653184
                                            },
                                            "ficheiros": {
                                                "total": 18842,
                                                "bytes": 1610612736,
                                                "bytes_legiveis": "1,5 GB"
                                            },
                                            "local": true,
                                            "verificacao_estado": "ok",
                                            "destino_tipo": "s3",
                                            "destino_estado": "enviada",
                                            "destino_estado_rotulo": "Enviada",
                                            "imutavel": true,
                                            "retencao_ate": "2026-12-03T02:41:58+00:00",
                                            "ligacao": {
                                                "web": "equipa/plataforma/operacao/copias/214",
                                                "app": "/e/estado_plataforma?copia=214"
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/plataforma/operacao/copias/pedir": {
            "post": {
                "tags": [
                    "Operação da plataforma"
                ],
                "operationId": "pedirCopia",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.operacao",
                "x-anagen-nivel": "editar",
                "summary": "Pedir uma cópia agora",
                "description": "Cria um pedido «pedida» (tipo manual) que o agendador executa nos minutos seguintes. Se já houver um pedido ou uma cópia em curso, devolve-o. 6 pedidos por 10 minutos. Reservado aos superadministradores da plataforma (403 so_superadmin / segundo_fator_necessario para todos os outros, incluindo administradores de clínica).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": "string",
                                        "maxLength": 255
                                    }
                                }
                            },
                            "example": {
                                "motivo": "Antes da atualização da versão"
                            }
                        }
                    }
                },
                "responses": {
                    "202": {
                        "description": "Pedido aceite (fica em fila para o agendador)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CopiaSeguranca"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    },
                    "409": {
                        "description": "Estado não permite (conflito)"
                    }
                }
            }
        },
        "/plataforma/operacao/copias/{id}": {
            "get": {
                "tags": [
                    "Operação da plataforma"
                ],
                "operationId": "obterCopia",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.operacao",
                "x-anagen-nivel": "ver",
                "summary": "Uma cópia, com os testes de restauro",
                "description": " Reservado aos superadministradores da plataforma (403 so_superadmin / segundo_fator_necessario para todos os outros, incluindo administradores de clínica).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "allOf": [
                                                {
                                                    "$ref": "#/components/schemas/CopiaSeguranca"
                                                },
                                                {
                                                    "type": "object",
                                                    "properties": {
                                                        "restauros": {
                                                            "type": "array",
                                                            "items": {
                                                                "$ref": "#/components/schemas/TesteRestauro"
                                                            }
                                                        }
                                                    }
                                                }
                                            ]
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 214,
                                        "origem": "automatica",
                                        "origem_rotulo": "automática",
                                        "tipo": "diaria",
                                        "tipo_rotulo": "Diária",
                                        "estado": "ok",
                                        "estado_rotulo": "Concluída",
                                        "estado_tom": "sucesso",
                                        "iniciada_em": "2026-10-29T02:30:04+00:00",
                                        "terminada_em": "2026-10-29T02:41:52+00:00",
                                        "duracao_legivel": "11 min 48 s",
                                        "nome": "anagensys-20261029-023004-diaria-214.axc",
                                        "tamanho": 1873420288,
                                        "tamanho_legivel": "1,7 GB",
                                        "sha256": "9b1e…c04f",
                                        "metodo_dump": "binario",
                                        "base_dados": {
                                            "tabelas": 186,
                                            "linhas": 2410377,
                                            "bytes": 402653184
                                        },
                                        "ficheiros": {
                                            "total": 18842,
                                            "bytes": 1610612736,
                                            "bytes_legiveis": "1,5 GB"
                                        },
                                        "local": true,
                                        "verificacao_estado": "ok",
                                        "destino_tipo": "s3",
                                        "destino_estado": "enviada",
                                        "destino_estado_rotulo": "Enviada",
                                        "imutavel": true,
                                        "retencao_ate": "2026-12-03T02:41:58+00:00",
                                        "ligacao": {
                                            "web": "equipa/plataforma/operacao/copias/214",
                                            "app": "/e/estado_plataforma?copia=214"
                                        },
                                        "restauros": []
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/plataforma/operacao/copias/{id}/enviar": {
            "post": {
                "tags": [
                    "Operação da plataforma"
                ],
                "operationId": "enviarCopia",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.operacao",
                "x-anagen-nivel": "editar",
                "summary": "Pedir o envio para o destino externo",
                "description": "Marca a cópia «por enviar»; o agendador envia-a (com bloqueio de objetos quando ativo). Nunca escreve por cima nem apaga no destino. Reservado aos superadministradores da plataforma (403 so_superadmin / segundo_fator_necessario para todos os outros, incluindo administradores de clínica).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "202": {
                        "description": "Pedido aceite (fica em fila para o agendador)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CopiaSeguranca"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    },
                    "409": {
                        "description": "Já enviada, sem ficheiro local ou não concluída"
                    }
                }
            }
        },
        "/plataforma/operacao/copias/{id}/verificar": {
            "post": {
                "tags": [
                    "Operação da plataforma"
                ],
                "operationId": "verificarCopia",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.operacao",
                "x-anagen-nivel": "editar",
                "summary": "Pedir a verificação de integridade",
                "description": "Impressão digital SHA-256 do ficheiro, assinatura HMAC do manifesto, decifragem completa com o resumo do conteúdo e, havendo destino, existência e tamanho no destino. Reservado aos superadministradores da plataforma (403 so_superadmin / segundo_fator_necessario para todos os outros, incluindo administradores de clínica).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "202": {
                        "description": "Pedido aceite (fica em fila para o agendador)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CopiaSeguranca"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    },
                    "409": {
                        "description": "Cópia inexistente ou não concluída"
                    }
                }
            }
        },
        "/plataforma/operacao/destino/testar": {
            "post": {
                "tags": [
                    "Operação da plataforma"
                ],
                "operationId": "testarDestinoCopias",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.operacao",
                "x-anagen-nivel": "editar",
                "summary": "Testar a ligação ao destino externo",
                "description": "Sem escrever nada: credenciais, pasta remota, impressão digital do servidor SFTP, bloqueio de objetos do contentor. 422 sem_destino quando não há destino. Reservado aos superadministradores da plataforma (403 so_superadmin / segundo_fator_necessario para todos os outros, incluindo administradores de clínica).",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ok": {
                                                    "type": "boolean"
                                                },
                                                "mensagem": {
                                                    "type": "string"
                                                },
                                                "detalhes": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ok": true,
                                        "mensagem": "Ligação ao destino confirmada.",
                                        "detalhes": [
                                            "O contentor tem o bloqueio de objetos ativo."
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/plataforma/operacao/restauros/pedir": {
            "post": {
                "tags": [
                    "Operação da plataforma"
                ],
                "operationId": "pedirTesteRestauro",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.operacao",
                "x-anagen-nivel": "editar",
                "summary": "Pedir um teste de restauro",
                "description": "Restaura a cópia indicada (ou a última válida) num esquema à parte configurado no servidor, compara tabelas e linhas com o manifesto, confere uma amostra dos ficheiros e apaga o esquema no fim. Reservado aos superadministradores da plataforma (403 so_superadmin / segundo_fator_necessario para todos os outros, incluindo administradores de clínica).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "copia_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "202": {
                        "description": "Pedido aceite (fica em fila para o agendador)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/TesteRestauro"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    },
                    "409": {
                        "description": "Cópia inexistente"
                    }
                }
            }
        },
        "/plataforma/operacao/restauros/{id}": {
            "get": {
                "tags": [
                    "Operação da plataforma"
                ],
                "operationId": "obterTesteRestauro",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.operacao",
                "x-anagen-nivel": "ver",
                "summary": "Um teste de restauro",
                "description": " Reservado aos superadministradores da plataforma (403 so_superadmin / segundo_fator_necessario para todos os outros, incluindo administradores de clínica).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/TesteRestauro"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/plataforma/operacao/vulnerabilidades": {
            "get": {
                "tags": [
                    "Operação da plataforma"
                ],
                "operationId": "listarVulnerabilidades",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.operacao",
                "x-anagen-nivel": "ver",
                "summary": "Vulnerabilidades",
                "description": "Por gravidade e prazo. f[estado]: abertas (omissão), todas ou um estado. meta.opcoes traz as listas com rótulos. Reservado aos superadministradores da plataforma (403 so_superadmin / segundo_fator_necessario para todos os outros, incluindo administradores de clínica).",
                "parameters": [
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "abertas",
                                "todas",
                                "aberta",
                                "em_correcao",
                                "corrigida",
                                "aceite",
                                "falso_positivo"
                            ]
                        }
                    },
                    {
                        "name": "f[gravidade]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "critica",
                                "alta",
                                "media",
                                "baixa",
                                "info"
                            ]
                        }
                    },
                    {
                        "name": "f[origem]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "composer_audit",
                                "pub_outdated",
                                "teste_intrusao",
                                "divulgacao",
                                "revisao_interna",
                                "asvs",
                                "outro"
                            ]
                        }
                    },
                    {
                        "name": "f[fora_prazo]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "1"
                            ]
                        }
                    },
                    {
                        "name": "pagina",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "por_pagina",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "maximum": 100
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Vulnerabilidade"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            },
            "post": {
                "tags": [
                    "Operação da plataforma"
                ],
                "operationId": "criarVulnerabilidade",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.operacao",
                "x-anagen-nivel": "editar",
                "summary": "Registar uma vulnerabilidade",
                "description": "Sem prazo_em, o prazo é a data de deteção mais os dias da gravidade (Definições da plataforma). Descrição e notas guardam-se cifradas. Auditada. Reservado aos superadministradores da plataforma (403 so_superadmin / segundo_fator_necessario para todos os outros, incluindo administradores de clínica).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "titulo": {
                                        "type": "string",
                                        "maxLength": 255
                                    },
                                    "gravidade": {
                                        "type": "string",
                                        "enum": [
                                            "critica",
                                            "alta",
                                            "media",
                                            "baixa",
                                            "info"
                                        ]
                                    },
                                    "origem": {
                                        "type": "string",
                                        "enum": [
                                            "composer_audit",
                                            "pub_outdated",
                                            "teste_intrusao",
                                            "divulgacao",
                                            "revisao_interna",
                                            "asvs",
                                            "outro"
                                        ]
                                    },
                                    "superficie": {
                                        "type": "string",
                                        "enum": [
                                            "servidor",
                                            "app",
                                            "infraestrutura",
                                            "processo"
                                        ]
                                    },
                                    "estado": {
                                        "type": "string",
                                        "enum": [
                                            "aberta",
                                            "em_correcao",
                                            "corrigida",
                                            "aceite",
                                            "falso_positivo"
                                        ]
                                    },
                                    "referencia": {
                                        "type": "string",
                                        "pattern": "^[A-Za-z0-9._:\\-]{2,80}$"
                                    },
                                    "componente": {
                                        "type": "string",
                                        "maxLength": 190
                                    },
                                    "versao": {
                                        "type": "string",
                                        "maxLength": 60
                                    },
                                    "detetada_em": {
                                        "type": "string",
                                        "format": "date"
                                    },
                                    "prazo_em": {
                                        "type": "string",
                                        "format": "date"
                                    },
                                    "descricao": {
                                        "type": "string",
                                        "maxLength": 10000
                                    },
                                    "notas": {
                                        "type": "string",
                                        "maxLength": 5000
                                    },
                                    "responsavel_id": {
                                        "type": "integer"
                                    },
                                    "atividade_id": {
                                        "type": "integer"
                                    }
                                },
                                "required": [
                                    "titulo",
                                    "gravidade",
                                    "origem"
                                ]
                            },
                            "example": {
                                "titulo": "Cabeçalho de segurança em falta numa página pública",
                                "gravidade": "media",
                                "origem": "teste_intrusao",
                                "superficie": "servidor",
                                "atividade_id": 3
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Vulnerabilidade"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/plataforma/operacao/vulnerabilidades/{id}": {
            "get": {
                "tags": [
                    "Operação da plataforma"
                ],
                "operationId": "obterVulnerabilidade",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.operacao",
                "x-anagen-nivel": "ver",
                "summary": "Uma vulnerabilidade (com descrição e notas)",
                "description": " Reservado aos superadministradores da plataforma (403 so_superadmin / segundo_fator_necessario para todos os outros, incluindo administradores de clínica).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Vulnerabilidade"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            },
            "put": {
                "tags": [
                    "Operação da plataforma"
                ],
                "operationId": "alterarVulnerabilidade",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.operacao",
                "x-anagen-nivel": "editar",
                "summary": "Alterar uma vulnerabilidade",
                "description": "Os mesmos campos da criação (só os enviados mudam). Corrigida, aceite ou falso positivo fecham-na com a data de resolução. Reservado aos superadministradores da plataforma (403 so_superadmin / segundo_fator_necessario para todos os outros, incluindo administradores de clínica).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "estado": {
                                        "type": "string",
                                        "enum": [
                                            "aberta",
                                            "em_correcao",
                                            "corrigida",
                                            "aceite",
                                            "falso_positivo"
                                        ]
                                    },
                                    "notas": {
                                        "type": "string"
                                    }
                                }
                            },
                            "example": {
                                "estado": "corrigida"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Vulnerabilidade"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/plataforma/seguranca": {
            "get": {
                "tags": [
                    "Segurança da plataforma"
                ],
                "operationId": "segurancaPainel",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.seguranca",
                "x-anagen-nivel": "editar",
                "summary": "Painel do escudo de entrada (24 h)",
                "description": "Reservado à gestão da plataforma (403 para todos os outros, incluindo administradores de clínica). Tabelas globais de infraestrutura.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "disponivel": {
                                                    "type": "boolean"
                                                },
                                                "ligado": {
                                                    "type": "boolean"
                                                },
                                                "estado": {
                                                    "type": "object"
                                                },
                                                "totais": {
                                                    "type": "object"
                                                },
                                                "serie": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "niveis": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "contas": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "origens": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "bloqueios": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "alertas": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "politica": {
                                                    "type": "object"
                                                },
                                                "gerado_em": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "estado": {
                                            "nivel": 0,
                                            "chave": "normal",
                                            "rotulo": "Normal",
                                            "falhas_5min": 2,
                                            "limite_anomalo": 20,
                                            "limite_ataque": 60
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/plataforma/seguranca/bloquear": {
            "post": {
                "tags": [
                    "Segurança da plataforma"
                ],
                "operationId": "segurancaBloquear",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.seguranca",
                "x-anagen-nivel": "editar",
                "summary": "Bloquear um endereço",
                "description": "horas 0 ou ausente = até alguém desbloquear. Nunca o próprio endereço de quem bloqueia.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "ip": {
                                        "type": "string"
                                    },
                                    "nota": {
                                        "type": "string"
                                    },
                                    "horas": {
                                        "type": "integer"
                                    }
                                },
                                "required": [
                                    "ip"
                                ]
                            },
                            "example": {
                                "ip": "203.0.113.7",
                                "horas": 48,
                                "nota": "Rede de robôs"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/plataforma/seguranca/conta/{conta}": {
            "get": {
                "tags": [
                    "Segurança da plataforma"
                ],
                "operationId": "segurancaConta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.seguranca",
                "x-anagen-nivel": "editar",
                "summary": "Ficha de uma conta (índice cego do email)",
                "parameters": [
                    {
                        "name": "conta",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^[0-9a-f]{64}$"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/plataforma/seguranca/desbloquear": {
            "post": {
                "tags": [
                    "Segurança da plataforma"
                ],
                "operationId": "segurancaDesbloquear",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.seguranca",
                "x-anagen-nivel": "editar",
                "summary": "Desbloquear um endereço",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "ip": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "ip"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/plataforma/seguranca/libertar": {
            "post": {
                "tags": [
                    "Segurança da plataforma"
                ],
                "operationId": "segurancaLibertar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.seguranca",
                "x-anagen-nivel": "editar",
                "summary": "Libertar uma conta da espera",
                "description": "A contagem de falhas recomeça; fica registado na auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "conta": {
                                        "type": "string",
                                        "pattern": "^[0-9a-f]{64}$"
                                    }
                                },
                                "required": [
                                    "conta"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/plataforma/seguranca/origem": {
            "get": {
                "tags": [
                    "Segurança da plataforma"
                ],
                "operationId": "segurancaOrigem",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.seguranca",
                "x-anagen-nivel": "editar",
                "summary": "Ficha de uma origem (endereço)",
                "parameters": [
                    {
                        "name": "ip",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/plataforma/seguranca/politica": {
            "put": {
                "tags": [
                    "Segurança da plataforma"
                ],
                "operationId": "segurancaPolitica",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "plataforma.seguranca",
                "x-anagen-nivel": "editar",
                "summary": "Gravar a política do escudo",
                "description": "Campos: ativo, bits_base (12–22), limite_anomalo, limite_ataque, conta_livres, espera_base (s), espera_maxima (s), janela_conta (min), bloqueio_tentativas, bloqueio_horas, dispositivo_dias, aviso_dispositivo_novo, alerta_emails (lista), escudo_dias. Valores da plataforma (gravados na clínica 1).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "ativo": {
                                        "type": "boolean"
                                    },
                                    "bits_base": {
                                        "type": "integer"
                                    },
                                    "limite_anomalo": {
                                        "type": "integer"
                                    },
                                    "limite_ataque": {
                                        "type": "integer"
                                    },
                                    "conta_livres": {
                                        "type": "integer"
                                    },
                                    "espera_base": {
                                        "type": "integer"
                                    },
                                    "espera_maxima": {
                                        "type": "integer"
                                    },
                                    "janela_conta": {
                                        "type": "integer"
                                    },
                                    "bloqueio_tentativas": {
                                        "type": "integer"
                                    },
                                    "bloqueio_horas": {
                                        "type": "integer"
                                    },
                                    "dispositivo_dias": {
                                        "type": "integer"
                                    },
                                    "aviso_dispositivo_novo": {
                                        "type": "boolean"
                                    },
                                    "alerta_emails": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        }
                                    },
                                    "escudo_dias": {
                                        "type": "integer"
                                    }
                                }
                            },
                            "example": {
                                "bits_base": 17,
                                "limite_anomalo": 20,
                                "limite_ataque": 60
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/plataforma/superadmins": {
            "get": {
                "x-anagen-modulo": "plataforma.superadmins",
                "x-anagen-nivel": "ver",
                "tags": [
                    "Superadministradores"
                ],
                "operationId": "listarSuperadmins",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Lista de superadministradores",
                "description": "Só superadministradores com o segundo fator ativo. Restantes contas: 403 so_superadmin (ou segundo_fator_necessario).",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "ativo",
                                "suspenso",
                                "convidado",
                                "bloqueado"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Superadmin"
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "total": {
                                                    "type": "integer"
                                                },
                                                "ativos": {
                                                    "type": "integer"
                                                },
                                                "sem_2fa": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            },
            "post": {
                "x-anagen-modulo": "plataforma.superadmins",
                "x-anagen-nivel": "editar",
                "tags": [
                    "Superadministradores"
                ],
                "operationId": "criarSuperadmin",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Criar (conta só de plataforma com convite) ou promover",
                "description": "Motivo obrigatório; auditado; os restantes superadministradores recebem um email. Promover termina as sessões da pessoa.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "modo": {
                                        "type": "string",
                                        "enum": [
                                            "novo",
                                            "promover"
                                        ]
                                    },
                                    "nome": {
                                        "type": "string"
                                    },
                                    "email": {
                                        "type": "string"
                                    },
                                    "utilizador_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "motivo": {
                                        "type": "string",
                                        "minLength": 5,
                                        "maxLength": 500
                                    }
                                },
                                "required": [
                                    "modo",
                                    "motivo"
                                ]
                            },
                            "example": {
                                "modo": "novo",
                                "nome": "Tiago Lopes",
                                "email": "tiago@anagen.pt",
                                "motivo": "Responsável técnico da plataforma."
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Superadmin"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/plataforma/superadmins/candidatos": {
            "get": {
                "x-anagen-modulo": "plataforma.superadmins",
                "x-anagen-nivel": "ver",
                "tags": [
                    "Superadministradores"
                ],
                "operationId": "candidatosSuperadmin",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Pessoas da equipa que podem ser promovidas",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "integer"
                                                    },
                                                    "nome": {
                                                        "type": "string"
                                                    },
                                                    "email": {
                                                        "type": "string"
                                                    },
                                                    "clinica_nome": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/plataforma/superadmins/{id}": {
            "get": {
                "x-anagen-modulo": "plataforma.superadmins",
                "x-anagen-nivel": "ver",
                "tags": [
                    "Superadministradores"
                ],
                "operationId": "obterSuperadmin",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Id da conta."
                    }
                ],
                "summary": "Detalhe com histórico",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Superadmin"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            },
            "put": {
                "x-anagen-modulo": "plataforma.superadmins",
                "x-anagen-nivel": "editar",
                "tags": [
                    "Superadministradores"
                ],
                "operationId": "editarSuperadmin",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Id da conta."
                    }
                ],
                "summary": "Editar nome, email, telefone e língua (motivo obrigatório)",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "nome": {
                                        "type": "string"
                                    },
                                    "email": {
                                        "type": "string"
                                    },
                                    "telefone": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "idioma": {
                                        "type": "string",
                                        "enum": [
                                            "pt-PT",
                                            "pt-BR",
                                            "en",
                                            "es",
                                            "fr",
                                            "de"
                                        ]
                                    },
                                    "motivo": {
                                        "type": "string",
                                        "minLength": 5,
                                        "maxLength": 500
                                    }
                                },
                                "required": [
                                    "motivo"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Superadmin"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/plataforma/superadmins/{id}/{acao}": {
            "post": {
                "x-anagen-modulo": "plataforma.superadmins",
                "x-anagen-nivel": "editar",
                "tags": [
                    "Superadministradores"
                ],
                "operationId": "acaoSuperadmin",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Id da conta."
                    },
                    {
                        "name": "acao",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "suspender",
                                "reativar",
                                "sessoes",
                                "repor-2fa",
                                "retirar",
                                "apagar",
                                "convite"
                            ]
                        }
                    }
                ],
                "summary": "Suspender, reativar, terminar sessões, repor 2FA, retirar estatuto, eliminar ou reenviar convite",
                "description": "Motivo obrigatório (exceto convite). Nunca sobre a própria conta (409 proprio) nem sobre o último superadministrador ativo (409 ultimo_superadmin). Auditado; email aos restantes superadministradores.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": "string",
                                        "minLength": 5,
                                        "maxLength": 500
                                    }
                                }
                            },
                            "example": {
                                "motivo": "Saída da empresa."
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Superadmin"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/portal/acessos": {
            "get": {
                "summary": "Quem acedeu aos meus dados",
                "description": "Fonte: Auditoria::acessosAoPaciente (registo imutável). Por omissão sem as ações do próprio paciente (minhas=1 inclui). Resumo, gráfico por dia (90 dias), pessoas e acessos paginados (25). O motivo só aparece nos acessos de emergência.",
                "parameters": [
                    {
                        "name": "de",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "acao",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "pessoa",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "minhas",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "enum": [
                                0,
                                1
                            ]
                        }
                    },
                    {
                        "name": "pagina",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "linhas": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/PortalAcesso"
                                                    }
                                                },
                                                "resumo": {
                                                    "type": "object"
                                                },
                                                "grafico": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "x": {
                                                                "type": "string"
                                                            },
                                                            "y": {
                                                                "type": "integer"
                                                            }
                                                        }
                                                    }
                                                },
                                                "pessoas": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "acoes": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "filtros": {
                                                    "type": "object"
                                                },
                                                "opcoes_acao": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "pagina": {
                                                    "type": "integer"
                                                },
                                                "por_pagina": {
                                                    "type": "integer"
                                                },
                                                "total": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "linhas": [
                                            {
                                                "id": 99120,
                                                "quando": "2026-10-28T09:41:00+00:00",
                                                "quem": "Dr.ª Inês Valente",
                                                "funcao": "Médico",
                                                "ator_tipo": "utilizador",
                                                "proprio": false,
                                                "acao": "ver",
                                                "acao_rotulo": "Ver",
                                                "area": "Ficha clínica",
                                                "origem": "web",
                                                "origem_rotulo": "Plataforma web",
                                                "emergencia": false,
                                                "motivo": null
                                            }
                                        ],
                                        "resumo": {
                                            "total": 14,
                                            "pessoas": 3,
                                            "emergencias": 0,
                                            "ultimo": "2026-10-28T09:41:00+00:00"
                                        },
                                        "grafico": [
                                            {
                                                "x": "2026-10-28",
                                                "y": 4
                                            }
                                        ],
                                        "pessoas": [
                                            {
                                                "quem": "Dr.ª Inês Valente",
                                                "funcao": "Médico",
                                                "total": 9
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — acessos"
                ],
                "operationId": "portalAcessos",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/auth/codigo": {
            "post": {
                "tags": [
                    "Portal — autenticação"
                ],
                "operationId": "portalPedirCodigo",
                "security": [],
                "summary": "Pedir código de entrada por email",
                "description": "A resposta é igual exista ou não a conta (não revela quem é paciente).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "email": {
                                        "type": "string",
                                        "format": "email"
                                    }
                                },
                                "required": [
                                    "email"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                },
                                                "validade_minutos": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/portal/auth/consentimentos": {
            "get": {
                "tags": [
                    "Portal — autenticação"
                ],
                "operationId": "portalConsentimentosRegisto",
                "security": [],
                "summary": "Consentimentos a mostrar no registo",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "modelo_id": {
                                                        "type": "integer"
                                                    },
                                                    "finalidade": {
                                                        "type": "string"
                                                    },
                                                    "titulo": {
                                                        "type": "string"
                                                    },
                                                    "texto": {
                                                        "type": "string",
                                                        "description": "HTML"
                                                    },
                                                    "versao": {
                                                        "type": "integer"
                                                    },
                                                    "obrigatorio": {
                                                        "type": "boolean"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        "/portal/auth/desafio": {
            "post": {
                "tags": [
                    "Escudo de entrada"
                ],
                "operationId": "desafioEscudoPortal",
                "security": [],
                "summary": "Desafio de verificação do dispositivo (portal do paciente)",
                "description": "Igual a /auth/desafio, para pedir código, entrar e registar no portal. Envie X-AX-Clinica com o código da clínica.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "dispositivo_confiavel": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": [
                                                "object",
                                                "null"
                                            ],
                                            "properties": {
                                                "desafio": {
                                                    "type": "string"
                                                },
                                                "salt": {
                                                    "type": "string",
                                                    "pattern": "^[0-9a-f]{32}$"
                                                },
                                                "bits": {
                                                    "type": "integer"
                                                },
                                                "nivel": {
                                                    "type": "integer",
                                                    "minimum": 0,
                                                    "maximum": 4
                                                },
                                                "valido_por": {
                                                    "type": "integer"
                                                },
                                                "minimo_ms": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "desafio": "eyJ2IjoxLCJpZCI6….9f2c…",
                                        "salt": "3f8a1c0e9b7d4a2f6e5c1b0a9d8e7f60",
                                        "bits": 17,
                                        "nivel": 0,
                                        "valido_por": 300,
                                        "minimo_ms": 0
                                    }
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/portal/auth/entrar": {
            "post": {
                "tags": [
                    "Portal — autenticação"
                ],
                "operationId": "portalEntrar",
                "security": [],
                "summary": "Entrar no portal (código ou palavra-passe)",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "email": {
                                        "type": "string",
                                        "format": "email"
                                    },
                                    "codigo": {
                                        "type": "string"
                                    },
                                    "palavra_passe": {
                                        "type": "string"
                                    },
                                    "dispositivo": {
                                        "type": "string"
                                    },
                                    "plataforma": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "email"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "acesso": {
                                                    "type": "string"
                                                },
                                                "renovacao": {
                                                    "type": "string"
                                                },
                                                "expira_em": {
                                                    "type": "string",
                                                    "format": "date-time"
                                                },
                                                "renovacao_expira_em": {
                                                    "type": "string",
                                                    "format": "date-time"
                                                },
                                                "tipo": {
                                                    "type": "string",
                                                    "enum": [
                                                        "equipa",
                                                        "paciente"
                                                    ]
                                                },
                                                "conta": {
                                                    "type": "object"
                                                },
                                                "codigos_recuperacao": {
                                                    "type": [
                                                        "array",
                                                        "null"
                                                    ],
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/portal/auth/registar": {
            "post": {
                "tags": [
                    "Portal — autenticação"
                ],
                "operationId": "portalRegistar",
                "security": [],
                "summary": "Criar conta no portal",
                "description": "Cria a conta pendente e envia um email de verificação (a conta só fica ativa depois de confirmada). Os consentimentos são os devolvidos por GET /portal/auth/consentimentos; os obrigatórios têm de vir aceites.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "nome": {
                                        "type": "string"
                                    },
                                    "apelidos": {
                                        "type": "string"
                                    },
                                    "email": {
                                        "type": "string",
                                        "format": "email"
                                    },
                                    "telefone": {
                                        "type": "string"
                                    },
                                    "palavra_passe": {
                                        "type": "string"
                                    },
                                    "idioma": {
                                        "type": "string"
                                    },
                                    "consentimentos": {
                                        "type": "object",
                                        "additionalProperties": {
                                            "type": "boolean"
                                        },
                                        "description": "modelo_id → aceite"
                                    }
                                },
                                "required": [
                                    "nome",
                                    "email",
                                    "palavra_passe"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                },
                                                "verificacao_horas": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/portal/consentimentos": {
            "get": {
                "summary": "Autorizações: estado, pendentes e histórico",
                "description": "Estado por finalidade (última decisão), modelos por assinar (pedidos pela clínica em portal.consentimentos_pedidos, novas versões e o consentimento cirúrgico do episódio em curso) e histórico imutável.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "finalidades": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/PortalFinalidade"
                                                    }
                                                },
                                                "pendentes": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/PortalModeloConsentimento"
                                                    }
                                                },
                                                "historico": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "finalidades": [
                                            {
                                                "finalidade": "marketing",
                                                "rotulo": "Comunicações comerciais",
                                                "descricao": "Comunicações sobre novidades e campanhas da clínica.",
                                                "decisao": "dado",
                                                "decisao_rotulo": "Dado",
                                                "em": "2026-09-02T18:11:00+00:00",
                                                "canal": "portal",
                                                "canal_rotulo": "Portal",
                                                "versao": 1,
                                                "obrigatorio": false,
                                                "base_legal": "consentimento",
                                                "base_legal_rotulo": "Consentimento",
                                                "pode_revogar": true,
                                                "pode_dar": false,
                                                "modelo_id": 4
                                            }
                                        ],
                                        "pendentes": [
                                            {
                                                "modelo_id": 12,
                                                "chave": "cirurgico_fue",
                                                "titulo": "Consentimento informado — FUE",
                                                "finalidade": "cirurgico",
                                                "finalidade_rotulo": "Cirúrgico",
                                                "versao": 3,
                                                "obrigatorio": true,
                                                "reflexao_horas": 24,
                                                "informacao_entregue_em": "2026-10-27T10:00:00+00:00",
                                                "pode_assinar_em": "2026-10-28T10:00:00+00:00",
                                                "pode_assinar": true,
                                                "precisa_ler": false,
                                                "motivo": "cirurgico",
                                                "motivo_rotulo": "Antes da cirurgia"
                                            }
                                        ],
                                        "historico": []
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — autorizações"
                ],
                "operationId": "portalConsentimentos",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/consentimentos/modelos/{id}": {
            "get": {
                "summary": "Texto de um modelo de consentimento",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Modelo aprovado"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PortalModeloConsentimento"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "modelo_id": 12,
                                        "chave": "cirurgico_fue",
                                        "titulo": "Consentimento informado — FUE",
                                        "finalidade": "cirurgico",
                                        "finalidade_rotulo": "Cirúrgico",
                                        "versao": 3,
                                        "obrigatorio": true,
                                        "reflexao_horas": 24,
                                        "informacao_entregue_em": "2026-10-27T10:00:00+00:00",
                                        "pode_assinar_em": "2026-10-28T10:00:00+00:00",
                                        "pode_assinar": true,
                                        "precisa_ler": false,
                                        "texto": "<p>…</p>",
                                        "campos_dgs": [
                                            {
                                                "chave": "riscos",
                                                "titulo": "Riscos",
                                                "texto": "<p>…</p>"
                                            }
                                        ],
                                        "assinatura": true,
                                        "decisao_atual": null
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — autorizações"
                ],
                "operationId": "portalModeloConsentimento",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/consentimentos/modelos/{id}/decidir": {
            "post": {
                "summary": "Dar ou recusar um consentimento",
                "description": "Com período de reflexão: exige a leitura e o fim do prazo (409 «reflexao»). Finalidades de consentimento escrito exigem a assinatura PNG. Linha imutável do núcleo com canal, versão e hash do texto. Efeitos: aviso ao médico/receção nos obrigatórios, cirúrgicos e recusas.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Modelo aprovado"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "decisao": {
                                        "type": "string",
                                        "enum": [
                                            "dado",
                                            "recusado"
                                        ]
                                    },
                                    "assinatura": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "contentEncoding": "base64",
                                        "contentMediaType": "image/png"
                                    }
                                },
                                "required": [
                                    "decisao"
                                ]
                            },
                            "example": {
                                "decisao": "dado",
                                "assinatura": "data:image/png;base64,iVBORw0KGgo…"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "finalidades": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/PortalFinalidade"
                                                    }
                                                },
                                                "pendentes": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/PortalModeloConsentimento"
                                                    }
                                                },
                                                "historico": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "finalidades": [
                                            {
                                                "finalidade": "marketing",
                                                "rotulo": "Comunicações comerciais",
                                                "descricao": "Comunicações sobre novidades e campanhas da clínica.",
                                                "decisao": "dado",
                                                "decisao_rotulo": "Dado",
                                                "em": "2026-09-02T18:11:00+00:00",
                                                "canal": "portal",
                                                "canal_rotulo": "Portal",
                                                "versao": 1,
                                                "obrigatorio": false,
                                                "base_legal": "consentimento",
                                                "base_legal_rotulo": "Consentimento",
                                                "pode_revogar": true,
                                                "pode_dar": false,
                                                "modelo_id": 4
                                            }
                                        ],
                                        "pendentes": [],
                                        "historico": []
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — autorizações"
                ],
                "operationId": "portalDecidirConsentimento",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/consentimentos/modelos/{id}/ler": {
            "post": {
                "summary": "Confirmar a receção da informação",
                "description": "Regista a entrega da informação (portal_leituras «informacao_consentimento», uma vez) e inicia o período de reflexão do modelo.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Modelo aprovado"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PortalModeloConsentimento"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "modelo_id": 12,
                                        "chave": "cirurgico_fue",
                                        "titulo": "Consentimento informado — FUE",
                                        "finalidade": "cirurgico",
                                        "finalidade_rotulo": "Cirúrgico",
                                        "versao": 3,
                                        "obrigatorio": true,
                                        "reflexao_horas": 24,
                                        "informacao_entregue_em": "2026-10-27T10:00:00+00:00",
                                        "pode_assinar_em": "2026-10-28T10:00:00+00:00",
                                        "pode_assinar": true,
                                        "precisa_ler": false
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — autorizações"
                ],
                "operationId": "portalLerConsentimento",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/consentimentos/{finalidade}/revogar": {
            "post": {
                "summary": "Retirar uma autorização opcional",
                "description": "Nova linha «revogado» (o registo nunca se apaga) com efeito imediato: Conformidade\\Revogacao::aplicar (M2) ou, sem ele, paragem das sequências do CRM e retirada de imagens de comunicação. Obrigatórias, tratamento clínico e cirúrgico: 409 «nao_revogavel». Efeitos: aviso à administração, webhook portal.consentimento_revogado.",
                "parameters": [
                    {
                        "name": "finalidade",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "fotografias_clinicas",
                                "imagens_comunicacao",
                                "captura_3d",
                                "gravacao_chamadas",
                                "gravacao_video",
                                "ia",
                                "agente_voz",
                                "marketing",
                                "partilha_terceiros",
                                "teleconsulta",
                                "contacto"
                            ]
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "maxLength": 500
                                    }
                                }
                            },
                            "example": {
                                "motivo": null
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "finalidades": [
                                            {
                                                "finalidade": "marketing",
                                                "rotulo": "Comunicações comerciais",
                                                "descricao": "Comunicações sobre novidades e campanhas da clínica.",
                                                "decisao": "revogado",
                                                "decisao_rotulo": "Retirado",
                                                "em": "2026-09-02T18:11:00+00:00",
                                                "canal": "portal",
                                                "canal_rotulo": "Portal",
                                                "versao": 1,
                                                "obrigatorio": false,
                                                "base_legal": "consentimento",
                                                "base_legal_rotulo": "Consentimento",
                                                "pode_revogar": false,
                                                "pode_dar": true,
                                                "modelo_id": 4
                                            }
                                        ],
                                        "pendentes": [],
                                        "historico": []
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — autorizações"
                ],
                "operationId": "portalRevogarConsentimento",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/cuidados": {
            "get": {
                "tags": [
                    "Portal · Cuidados por fase"
                ],
                "operationId": "portalCuidados",
                "summary": "Conteúdos disponíveis e próximos",
                "description": "Dia desde a cirurgia (calendário de acompanhamento), conteúdos já disponíveis (os mais recentes primeiro, «novo» até abrir) e os próximos com a data. 403 funcionalidade_desativada quando a recuperação está desligada.",
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "disponivel": {
                                                    "type": "boolean"
                                                },
                                                "cirurgia_data": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date"
                                                },
                                                "dia": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                },
                                                "conteudos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "integer"
                                                            },
                                                            "titulo": {
                                                                "type": "string"
                                                            },
                                                            "tipo": {
                                                                "type": "string",
                                                                "enum": [
                                                                    "video",
                                                                    "artigo"
                                                                ]
                                                            },
                                                            "dia": {
                                                                "type": "integer"
                                                            },
                                                            "fase": {
                                                                "type": "string",
                                                                "enum": [
                                                                    "dia0",
                                                                    "semana1",
                                                                    "semanas",
                                                                    "mes1",
                                                                    "meses"
                                                                ]
                                                            },
                                                            "fase_rotulo": {
                                                                "type": "string"
                                                            },
                                                            "resumo": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "duracao_segundos": {
                                                                "type": [
                                                                    "integer",
                                                                    "null"
                                                                ]
                                                            },
                                                            "tem_video": {
                                                                "type": "boolean"
                                                            },
                                                            "novo": {
                                                                "type": "boolean"
                                                            },
                                                            "disponivel_em": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ],
                                                                "format": "date"
                                                            },
                                                            "bloqueado": {
                                                                "type": "boolean"
                                                            }
                                                        }
                                                    }
                                                },
                                                "proximos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "integer"
                                                            },
                                                            "titulo": {
                                                                "type": "string"
                                                            },
                                                            "tipo": {
                                                                "type": "string",
                                                                "enum": [
                                                                    "video",
                                                                    "artigo"
                                                                ]
                                                            },
                                                            "dia": {
                                                                "type": "integer"
                                                            },
                                                            "fase": {
                                                                "type": "string",
                                                                "enum": [
                                                                    "dia0",
                                                                    "semana1",
                                                                    "semanas",
                                                                    "mes1",
                                                                    "meses"
                                                                ]
                                                            },
                                                            "fase_rotulo": {
                                                                "type": "string"
                                                            },
                                                            "resumo": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "duracao_segundos": {
                                                                "type": [
                                                                    "integer",
                                                                    "null"
                                                                ]
                                                            },
                                                            "tem_video": {
                                                                "type": "boolean"
                                                            },
                                                            "novo": {
                                                                "type": "boolean"
                                                            },
                                                            "disponivel_em": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ],
                                                                "format": "date"
                                                            },
                                                            "bloqueado": {
                                                                "type": "boolean"
                                                            }
                                                        }
                                                    }
                                                },
                                                "novos": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "disponivel": true,
                                        "cirurgia_data": "2026-10-20",
                                        "dia": 9,
                                        "conteudos": [
                                            {
                                                "id": 4,
                                                "titulo": "Lavar o couro cabeludo nos primeiros dias",
                                                "tipo": "video",
                                                "dia": 3,
                                                "fase": "semana1",
                                                "fase_rotulo": "1.ª semana · dia 3",
                                                "novo": false
                                            }
                                        ],
                                        "proximos": [
                                            {
                                                "id": 6,
                                                "titulo": "Voltar ao exercício",
                                                "dia": 10,
                                                "disponivel_em": "2026-10-30",
                                                "bloqueado": true
                                            }
                                        ],
                                        "novos": 0
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/portal/cuidados/{id}": {
            "get": {
                "tags": [
                    "Portal · Cuidados por fase"
                ],
                "operationId": "portalCuidado",
                "summary": "Abrir um conteúdo",
                "description": "Texto sanitizado e vídeo por ligação assinada (60 min). Só conteúdos já disponíveis e aprovados; abrir regista a vista.",
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 4
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "allOf": [
                                                {
                                                    "type": "object",
                                                    "properties": {
                                                        "id": {
                                                            "type": "integer"
                                                        },
                                                        "titulo": {
                                                            "type": "string"
                                                        },
                                                        "tipo": {
                                                            "type": "string",
                                                            "enum": [
                                                                "video",
                                                                "artigo"
                                                            ]
                                                        },
                                                        "dia": {
                                                            "type": "integer"
                                                        },
                                                        "fase": {
                                                            "type": "string",
                                                            "enum": [
                                                                "dia0",
                                                                "semana1",
                                                                "semanas",
                                                                "mes1",
                                                                "meses"
                                                            ]
                                                        },
                                                        "fase_rotulo": {
                                                            "type": "string"
                                                        },
                                                        "resumo": {
                                                            "type": [
                                                                "string",
                                                                "null"
                                                            ]
                                                        },
                                                        "duracao_segundos": {
                                                            "type": [
                                                                "integer",
                                                                "null"
                                                            ]
                                                        },
                                                        "tem_video": {
                                                            "type": "boolean"
                                                        },
                                                        "novo": {
                                                            "type": "boolean"
                                                        },
                                                        "disponivel_em": {
                                                            "type": [
                                                                "string",
                                                                "null"
                                                            ],
                                                            "format": "date"
                                                        },
                                                        "bloqueado": {
                                                            "type": "boolean"
                                                        }
                                                    }
                                                },
                                                {
                                                    "type": "object",
                                                    "properties": {
                                                        "corpo": {
                                                            "type": "string",
                                                            "description": "HTML sanitizado."
                                                        },
                                                        "video": {
                                                            "type": [
                                                                "object",
                                                                "null"
                                                            ],
                                                            "properties": {
                                                                "url": {
                                                                    "type": "string",
                                                                    "format": "uri"
                                                                },
                                                                "mime": {
                                                                    "type": "string"
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            ]
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/portal/dados": {
            "get": {
                "summary": "Os meus dados, preferências e pedidos",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PortalDados"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "paciente": {
                                            "numero": "P-2026-00012",
                                            "nome_completo": "Rita Matos",
                                            "data_nascimento": "1988-04-02",
                                            "email": "rita@exemplo.pt",
                                            "telefone": "+351912345678",
                                            "telefone_alt": null,
                                            "morada": "Rua das Flores, 12",
                                            "codigo_postal": "4050-262",
                                            "localidade": "Porto",
                                            "pais": "PT",
                                            "idioma": "pt-PT"
                                        },
                                        "alergias": [],
                                        "preferencias": {
                                            "idioma": "pt-PT",
                                            "canal_preferido": "whatsapp",
                                            "lembretes": true,
                                            "horario": "tarde",
                                            "avisos_email": true,
                                            "marketing": false
                                        },
                                        "pedidos": [
                                            {
                                                "id": 15,
                                                "tipo": "contactos",
                                                "tipo_rotulo": "Atualizar contactos",
                                                "estado": "pendente",
                                                "estado_rotulo": "Recebido",
                                                "criado_em": "2026-10-28T10:02:00+00:00",
                                                "prazo": null,
                                                "decidido_em": null,
                                                "resposta": null,
                                                "mensagem": "Pedido enviado. A equipa vai validá-lo."
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — os meus dados"
                ],
                "operationId": "portalDados",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/dados/alergias": {
            "post": {
                "summary": "Comunicar ou retirar uma alergia",
                "description": "Pedido «alergias» cifrado com a chave clínica, validado por quem pode editar a ficha clínica. Gravidade «alta» cria tarefa de prioridade alta (portal.departamento_alergias).",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "acao": {
                                        "type": "string",
                                        "enum": [
                                            "acrescentar",
                                            "retirar"
                                        ]
                                    },
                                    "descricao": {
                                        "type": "string",
                                        "minLength": 3,
                                        "maxLength": 500
                                    },
                                    "gravidade": {
                                        "type": "string",
                                        "enum": [
                                            "baixa",
                                            "media",
                                            "alta",
                                            "nao_sei"
                                        ]
                                    },
                                    "alerta_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "acao"
                                ]
                            },
                            "example": {
                                "acao": "acrescentar",
                                "descricao": "Penicilina",
                                "gravidade": "alta"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PortalPedido"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 15,
                                        "tipo": "alergias",
                                        "tipo_rotulo": "Alergias",
                                        "estado": "pendente",
                                        "estado_rotulo": "Recebido",
                                        "criado_em": "2026-10-28T10:02:00+00:00",
                                        "prazo": null,
                                        "decidido_em": null,
                                        "resposta": null,
                                        "mensagem": "Pedido enviado. A equipa vai validá-lo."
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — os meus dados"
                ],
                "operationId": "portalComunicarAlergia",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/dados/contactos": {
            "post": {
                "summary": "Propor a atualização dos contactos",
                "description": "Cria um pedido «contactos» por validar (antes → depois, cifrado). A ficha só muda quando a equipa aceita no recurso portal_pedidos. Efeitos: tarefa para portal.departamento_dados, webhook portal.pedido_criado.",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "telefone": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "telefone_alt": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "morada": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "codigo_postal": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "pattern": "^\\d{4}-\\d{3}$"
                                    },
                                    "localidade": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "pais": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "telefone": "+351913000111",
                                "morada": "Rua Nova, 5"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PortalPedido"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 15,
                                        "tipo": "contactos",
                                        "tipo_rotulo": "Atualizar contactos",
                                        "estado": "pendente",
                                        "estado_rotulo": "Recebido",
                                        "criado_em": "2026-10-28T10:02:00+00:00",
                                        "prazo": null,
                                        "decidido_em": null,
                                        "resposta": null,
                                        "mensagem": "Pedido enviado. A equipa vai validá-lo."
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — os meus dados"
                ],
                "operationId": "portalProporContactos",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/dados/eliminar-conta": {
            "post": {
                "summary": "Pedir a eliminação da conta",
                "description": "confirmar = true. A conta passa a «eliminacao_pedida», todas as sessões e tokens terminam, segue email de confirmação e um pedido «eliminar_conta» (prazo legal) para a administração. O processo clínico e a faturação são conservados pelos prazos legais.",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "confirmar": {
                                        "const": true
                                    },
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "maxLength": 1000
                                    }
                                },
                                "required": [
                                    "confirmar"
                                ]
                            },
                            "example": {
                                "confirmar": true,
                                "motivo": null
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                },
                                                "sessao_terminada": {
                                                    "type": "boolean"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "mensagem": "Pedido registado. A sua sessão terminou.",
                                        "sessao_terminada": true
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — os meus dados"
                ],
                "operationId": "portalEliminarConta",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/dados/exportar": {
            "get": {
                "summary": "Portabilidade: exportar os meus dados",
                "description": "JSON estruturado (formato anagensys.portabilidade.v1): titular, alergias, preferências, conta, consentimentos, marcações, documentos, pagamentos, faturas, mensagens e pedidos. Auditoria «exportar» e pedido de portabilidade concluído.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "formato": {
                                                    "const": "anagensys.portabilidade.v1"
                                                },
                                                "gerado_em": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                },
                                                "titular": {
                                                    "type": "object"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "formato": "anagensys.portabilidade.v1",
                                        "gerado_em": "2026-10-28T10:50:00+00:00",
                                        "titular": {
                                            "nome_completo": "Rita Matos"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — os meus dados"
                ],
                "operationId": "portalExportar",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/dados/palavra-passe": {
            "post": {
                "summary": "Definir ou mudar a palavra-passe",
                "description": "Exige a atual quando já existe uma; política de palavras-passe do núcleo. Sobe a versão da sessão e revoga todos os tokens (a app volta a entrar).",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "atual": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "nova": {
                                        "type": "string",
                                        "minLength": 10,
                                        "maxLength": 200
                                    }
                                },
                                "required": [
                                    "nova"
                                ]
                            },
                            "example": {
                                "atual": "••••••••••",
                                "nova": "••••••••••••"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                },
                                                "sessao_terminada": {
                                                    "type": "boolean"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "mensagem": "Palavra-passe guardada. As outras sessões terminaram.",
                                        "sessao_terminada": true
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — os meus dados"
                ],
                "operationId": "portalPalavraPasse",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/dados/pedidos": {
            "post": {
                "summary": "Exercer um direito do titular",
                "description": "Acesso, retificação, apagamento, oposição ou limitação (portabilidade: usar GET /portal/dados/exportar). Prazo legal de 30 dias; encaminhado para pedidos_titulares (M2) quando existe; tarefa de prioridade alta para portal.departamento_rgpd. Um pedido aberto por tipo (409).",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "tipo": {
                                        "type": "string",
                                        "enum": [
                                            "acesso",
                                            "retificacao",
                                            "portabilidade",
                                            "apagamento",
                                            "oposicao",
                                            "limitacao"
                                        ]
                                    },
                                    "descricao": {
                                        "type": "string",
                                        "maxLength": 2000
                                    }
                                },
                                "required": [
                                    "tipo"
                                ]
                            },
                            "example": {
                                "tipo": "acesso",
                                "descricao": "Pedido de cópia do processo clínico."
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PortalPedido"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 16,
                                        "tipo": "acesso",
                                        "estado": "pendente",
                                        "prazo": "2026-11-27",
                                        "mensagem": "Pedido registado. Resposta até 27/11/2026."
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — os meus dados"
                ],
                "operationId": "portalPedidoDireito",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/dados/preferencias": {
            "put": {
                "summary": "Preferências de comunicação e língua",
                "description": "Efeito imediato (portal_contas.preferencias e pacientes.idioma). marketing regista um consentimento «dado» ou a revogação.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "idioma": {
                                        "type": "string",
                                        "enum": [
                                            "pt-PT",
                                            "pt-BR",
                                            "en",
                                            "es",
                                            "fr",
                                            "de"
                                        ]
                                    },
                                    "canal_preferido": {
                                        "type": "string",
                                        "enum": [
                                            "email",
                                            "sms",
                                            "whatsapp",
                                            "telefone"
                                        ]
                                    },
                                    "horario": {
                                        "type": "string",
                                        "enum": [
                                            "manha",
                                            "tarde",
                                            "qualquer"
                                        ]
                                    },
                                    "lembretes": {
                                        "type": "boolean"
                                    },
                                    "avisos_email": {
                                        "type": "boolean"
                                    },
                                    "marketing": {
                                        "type": "boolean"
                                    }
                                }
                            },
                            "example": {
                                "idioma": "en",
                                "canal_preferido": "email",
                                "lembretes": true
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PortalDados"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "preferencias": {
                                            "idioma": "en",
                                            "canal_preferido": "email",
                                            "lembretes": true,
                                            "horario": "qualquer",
                                            "avisos_email": true,
                                            "marketing": false
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — os meus dados"
                ],
                "operationId": "portalPreferencias",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/documentos": {
            "get": {
                "summary": "Documentos, formulários e envios",
                "description": "Documentos partilhados (documentos.partilhado_paciente e ficheiros partilhados pela equipa), por assinar, enviados pelo paciente e formulários pedidos (por preencher).",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "partilhados": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/PortalDocumento"
                                                    }
                                                },
                                                "por_assinar": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/PortalDocumento"
                                                    }
                                                },
                                                "enviados": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "formularios": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "pode_enviar": {
                                                    "type": "boolean"
                                                },
                                                "tipos_envio": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "max_mb": {
                                                    "type": "integer",
                                                    "x-unidade": "MB"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "partilhados": [],
                                        "por_assinar": [
                                            {
                                                "id": 305,
                                                "ficheiro_id": 9921,
                                                "origem": "documento",
                                                "titulo": "Instruções pré-operatórias",
                                                "tipo": "instrucoes",
                                                "tipo_rotulo": "Instruções",
                                                "estado": "enviado",
                                                "estado_rotulo": "Por assinar",
                                                "data": "2026-10-27T11:00:00+00:00",
                                                "assinado_em": null,
                                                "codigo_verificacao": "7KQ2-9XHM",
                                                "pode_assinar": true,
                                                "lido_em": null,
                                                "url": "https://anagen.pt/f/eyJmIjo5OTIx….a1b",
                                                "url_descarregar": "https://anagen.pt/f/eyJmIjo5OTIx….c2d"
                                            }
                                        ],
                                        "enviados": [],
                                        "formularios": [
                                            {
                                                "id": 51,
                                                "nome": "Questionário pré-operatório",
                                                "tipo": "questionario_previo",
                                                "pedido_em": "2026-10-26T09:00:00+00:00",
                                                "expira_em": "2026-11-02T23:59:00+00:00"
                                            }
                                        ],
                                        "pode_enviar": true,
                                        "tipos_envio": [
                                            {
                                                "valor": "exame",
                                                "rotulo": "Exame"
                                            }
                                        ],
                                        "max_mb": 25
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — documentos"
                ],
                "operationId": "portalDocumentos",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            },
            "post": {
                "summary": "Enviar um documento",
                "description": "PDF, imagem ou documento; tipo real verificado pelo conteúdo, extensões executáveis recusadas, nome aleatório, guardado cifrado fora da raiz pública (núcleo Ficheiros). Efeitos: tarefa para o departamento portal.departamento_documentos, linha do tempo, webhook portal.documento_enviado.",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ficheiro"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary"
                                    },
                                    "titulo": {
                                        "type": "string",
                                        "maxLength": 160
                                    },
                                    "tipo": {
                                        "type": "string",
                                        "enum": [
                                            "exame",
                                            "analises",
                                            "relatorio",
                                            "receita",
                                            "identificacao",
                                            "outro"
                                        ]
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 10101,
                                        "titulo": "Análises",
                                        "tipo": "analises",
                                        "tipo_rotulo": "Análises",
                                        "nome": "analises.pdf",
                                        "tipo_logico": "pdf",
                                        "tamanho": 183224,
                                        "data": "2026-10-28T10:30:00+00:00",
                                        "url": "https://anagen.pt/f/…"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — documentos"
                ],
                "operationId": "portalEnviarDocumento",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/documentos/{id}": {
            "get": {
                "summary": "Documento partilhado",
                "description": "Com ligações assinadas (ver e descarregar, 15 min); a primeira abertura fica registada.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Identificador"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PortalDocumento"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 305,
                                        "ficheiro_id": 9921,
                                        "origem": "documento",
                                        "titulo": "Instruções pré-operatórias",
                                        "tipo": "instrucoes",
                                        "tipo_rotulo": "Instruções",
                                        "estado": "enviado",
                                        "estado_rotulo": "Por assinar",
                                        "data": "2026-10-27T11:00:00+00:00",
                                        "assinado_em": null,
                                        "codigo_verificacao": "7KQ2-9XHM",
                                        "pode_assinar": true,
                                        "lido_em": null,
                                        "url": "https://anagen.pt/f/eyJmIjo5OTIx….a1b",
                                        "url_descarregar": "https://anagen.pt/f/eyJmIjo5OTIx….c2d"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — documentos"
                ],
                "operationId": "portalDocumento",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/documentos/{id}/assinar": {
            "post": {
                "summary": "Assinar um documento no ecrã",
                "description": "Só documentos «enviado» por assinar. Guarda a assinatura (PNG) e passa a «assinado» (assinatura_tipo «ecra»). Efeitos: aviso a quem emitiu, linha do tempo, auditoria «assinar».",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Identificador"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "aceito": {
                                        "type": "boolean"
                                    },
                                    "assinatura": {
                                        "type": "string",
                                        "contentEncoding": "base64",
                                        "contentMediaType": "image/png"
                                    }
                                },
                                "required": [
                                    "aceito",
                                    "assinatura"
                                ]
                            },
                            "example": {
                                "aceito": true,
                                "assinatura": "data:image/png;base64,iVBORw0KGgo…"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PortalDocumento"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 305,
                                        "ficheiro_id": 9921,
                                        "origem": "documento",
                                        "titulo": "Instruções pré-operatórias",
                                        "tipo": "instrucoes",
                                        "tipo_rotulo": "Instruções",
                                        "estado": "assinado",
                                        "estado_rotulo": "Assinado",
                                        "data": "2026-10-27T11:00:00+00:00",
                                        "assinado_em": "2026-10-28T10:40:00+00:00",
                                        "codigo_verificacao": "7KQ2-9XHM",
                                        "pode_assinar": false,
                                        "lido_em": null,
                                        "url": "https://anagen.pt/f/eyJmIjo5OTIx….a1b",
                                        "url_descarregar": "https://anagen.pt/f/eyJmIjo5OTIx….c2d"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — documentos"
                ],
                "operationId": "portalAssinarDocumento",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/ficha/restricoes": {
            "get": {
                "tags": [
                    "Ficha do paciente"
                ],
                "operationId": "m1PortalRestricoes",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente",
                "summary": "Portal: restrições de acesso por secção da minha ficha",
                "description": "Só tokens de paciente (portal). As secções que o paciente pode restringir (consultas, fotografias, plano, cirurgias, acompanhamento, documentos, consentimentos, comunicações, marcações e financeiro, as que existirem) e o estado de cada uma. Os alertas clínicos, a identificação, os episódios e a linha do tempo nunca ficam restritos. Segue a funcionalidade «acessos» do portal.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "seccoes": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "chave": {
                                                                "type": "string"
                                                            },
                                                            "titulo": {
                                                                "type": "string"
                                                            },
                                                            "icone": {
                                                                "type": "string"
                                                            },
                                                            "descricao": {
                                                                "type": "string"
                                                            },
                                                            "restrita": {
                                                                "type": "boolean"
                                                            },
                                                            "desde": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ],
                                                                "format": "date-time"
                                                            }
                                                        }
                                                    }
                                                },
                                                "total": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "seccoes": [
                                            {
                                                "chave": "fotografias",
                                                "titulo": "Fotografias",
                                                "icone": "camera",
                                                "descricao": "Fotografias clínicas e capturas.",
                                                "restrita": true,
                                                "desde": "2026-10-29T09:00:00+00:00"
                                            }
                                        ],
                                        "total": 1
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            },
            "post": {
                "tags": [
                    "Ficha do paciente"
                ],
                "operationId": "m1PortalDefinirRestricao",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente",
                "summary": "Portal: restringir ou levantar a restrição de uma secção",
                "description": "Com a restrição ativa, a secção continua listada na ficha (marcada «restrita», sem contador) mas só abre com acesso de emergência, que fica na auditoria com «quebrar_vidro» e aparece em «Quem acedeu aos meus dados»; o resumo FHIR omite-a. Secção fora da lista → 422 em «seccao». Efeitos: linha de histórico imutável, auditoria «alterar» e linha do tempo (administrativa). Devolve o mesmo formato do GET.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "seccao": {
                                        "type": "string"
                                    },
                                    "restringir": {
                                        "type": "boolean"
                                    }
                                },
                                "required": [
                                    "seccao",
                                    "restringir"
                                ]
                            },
                            "example": {
                                "seccao": "fotografias",
                                "restringir": true
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "seccoes": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "total": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/portal/ficha/resumo-fhir": {
            "get": {
                "tags": [
                    "Ficha do paciente"
                ],
                "operationId": "m1PortalResumoFhir",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente",
                "summary": "Portal: o meu resumo em HL7 FHIR R4 (IPS)",
                "description": "O mesmo Bundle de GET /pacientes/{id}/resumo-fhir, da própria ficha (as restrições não se aplicam ao próprio). envelope=1 → envelope comum com meta.ficheiro. Efeitos: auditoria «exportar».",
                "parameters": [
                    {
                        "name": "envelope",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "1"
                            ]
                        },
                        "description": "1 → no envelope comum"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Bundle FHIR R4 (IPS)",
                        "content": {
                            "application/fhir+json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/portal/formularios/{id}": {
            "get": {
                "summary": "Formulário pedido ao paciente",
                "description": "Esquema normalizado (secções e campos) do formulário do M1 ainda por preencher e dentro do prazo.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Resposta pedida"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PortalFormulario"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 51,
                                        "nome": "Questionário pré-operatório",
                                        "tipo": "questionario_previo",
                                        "expira_em": "2026-11-02T23:59:00+00:00",
                                        "seccoes": [
                                            {
                                                "titulo": "Medicação",
                                                "campos": [
                                                    {
                                                        "chave": "anticoagulantes",
                                                        "tipo": "booleano",
                                                        "rotulo": "Toma anticoagulantes?",
                                                        "ajuda": null,
                                                        "obrigatorio": true,
                                                        "opcoes": [
                                                            {
                                                                "valor": "1",
                                                                "rotulo": "Sim"
                                                            },
                                                            {
                                                                "valor": "0",
                                                                "rotulo": "Não"
                                                            }
                                                        ]
                                                    }
                                                ]
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — documentos"
                ],
                "operationId": "portalFormulario",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            },
            "post": {
                "summary": "Responder a um formulário",
                "description": "Pelo motor dos formulários do M1 (Clinica\\Formularios::submeter): validação contra a versão do pedido (perguntas, condições, tipos), consentimento «tratamento_clinico» — e «fotografias_clinicas» com fotografias — já dado ou declarado em «consentimentos» (senão 422 por campo «consentimentos.<finalidade>»), só as fotografias carregadas para este pedido, respostas cifradas, pontuação, alarmes, alertas por validar e webhook formulario.respondido; estado «por_validar». O GET traz também, como acréscimos compatíveis, «esquema» (versão do pedido), «valores», «consentimentos» e «devolucao_motivo». Efeitos: aviso ao médico do episódio, linha do tempo, auditoria.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Resposta pedida"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "respostas": {
                                        "type": "object",
                                        "additionalProperties": true
                                    },
                                    "consentimentos": {
                                        "type": "object",
                                        "additionalProperties": {
                                            "type": "boolean"
                                        }
                                    }
                                },
                                "required": [
                                    "respostas"
                                ]
                            },
                            "example": {
                                "respostas": {
                                    "anticoagulantes": "nao"
                                },
                                "consentimentos": {
                                    "tratamento_clinico": true
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "estado": {
                                                    "type": "string"
                                                },
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 51,
                                        "estado": "por_validar",
                                        "mensagem": "Respostas enviadas. A equipa vai revê-las."
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — documentos"
                ],
                "operationId": "portalResponderFormulario",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/formularios/{id}/ficheiros": {
            "post": {
                "summary": "Fotografia de uma pergunta do formulário",
                "description": "Multipart «ficheiro» (só imagens, 15 MB, tipo real pelos bytes, cifrada, ligada a este pedido) e «consentimento_fotos» = 1 quando a autorização para as fotografias foi assinalada agora; sem ela (e sem consentimento já dado) 422 em «ficheiro». Devolve o identificador a usar na resposta.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Resposta pedida"
                    }
                ],
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "nome": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 9051,
                                        "nome": "frontal.jpg"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — documentos"
                ],
                "operationId": "portalFicheiroFormulario",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/fotos": {
            "get": {
                "summary": "Protocolo, pedidos e fotografias",
                "description": "Vistas do protocolo «portal» (ou as seis vistas padrão) com instruções e silhueta, pedidos por marco, fotografias enviadas e partilhadas pelo médico (nunca simulações), e os limites de qualidade.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "protocolo": {
                                                    "type": "object",
                                                    "properties": {
                                                        "id": {
                                                            "type": [
                                                                "integer",
                                                                "null"
                                                            ]
                                                        },
                                                        "nome": {
                                                            "type": "string"
                                                        },
                                                        "vistas": {
                                                            "type": "array",
                                                            "items": {
                                                                "type": "object",
                                                                "properties": {
                                                                    "chave": {
                                                                        "type": "string"
                                                                    },
                                                                    "nome": {
                                                                        "type": "string"
                                                                    },
                                                                    "instrucoes": {
                                                                        "type": "string"
                                                                    },
                                                                    "silhueta": {
                                                                        "type": "string",
                                                                        "enum": [
                                                                            "frontal",
                                                                            "topo",
                                                                            "coroa",
                                                                            "lateral_esq",
                                                                            "lateral_dir",
                                                                            "dadora"
                                                                        ]
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                },
                                                "pedidos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "enviadas": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/PortalFoto"
                                                    }
                                                },
                                                "partilhadas": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/PortalFoto"
                                                    }
                                                },
                                                "qualidade": {
                                                    "type": "object",
                                                    "properties": {
                                                        "luz_min": {
                                                            "type": "integer"
                                                        },
                                                        "luz_max": {
                                                            "type": "integer"
                                                        },
                                                        "nitidez_min": {
                                                            "type": "number"
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "protocolo": {
                                            "id": null,
                                            "nome": "Fotografias de acompanhamento",
                                            "vistas": [
                                                {
                                                    "chave": "frontal",
                                                    "nome": "Frente",
                                                    "instrucoes": "Olhe em frente…",
                                                    "silhueta": "frontal"
                                                }
                                            ]
                                        },
                                        "pedidos": [
                                            {
                                                "id": 66,
                                                "marco": "m1",
                                                "marco_rotulo": "1 mês",
                                                "data_prevista": "2026-11-20",
                                                "estado": "pendente",
                                                "atrasado": false
                                            }
                                        ],
                                        "enviadas": [
                                            {
                                                "id": 5021,
                                                "ficheiro_id": 10044,
                                                "vista": "frontal",
                                                "vista_rotulo": "Frente",
                                                "estado": "por_verificar",
                                                "estado_rotulo": "Em revisão",
                                                "data": "2026-10-28T09:12:00+00:00",
                                                "url": "https://anagen.pt/f/eyJmIjoxMDA0NC….9z"
                                            }
                                        ],
                                        "partilhadas": [],
                                        "qualidade": {
                                            "luz_min": 60,
                                            "luz_max": 225,
                                            "nitidez_min": 18
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — fotografias"
                ],
                "operationId": "portalFotos",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            },
            "post": {
                "summary": "Enviar a fotografia de uma vista",
                "description": "Verificação de luz (média 0–255) e foco (desvio padrão do laplaciano) no servidor, com os limites das Definições; fora dos limites → 422, salvo forcar = 1. Ficheiro clínico cifrado sem EXIF/GPS; linha em «fotos» (origem portal, por verificar) e marco a «fotos_enviadas». Efeitos: um aviso por dia ao departamento portal.departamento_fotos, linha do tempo, webhook portal.fotos_enviadas.",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ficheiro",
                                    "vista"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary"
                                    },
                                    "vista": {
                                        "type": "string"
                                    },
                                    "marco_id": {
                                        "type": "integer"
                                    },
                                    "forcar": {
                                        "type": "integer",
                                        "enum": [
                                            0,
                                            1
                                        ]
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PortalFoto"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 5021,
                                        "ficheiro_id": 10044,
                                        "vista": "frontal",
                                        "vista_rotulo": "Frente",
                                        "estado": "por_verificar",
                                        "estado_rotulo": "Em revisão",
                                        "data": "2026-10-28T09:12:00+00:00",
                                        "url": "https://anagen.pt/f/eyJmIjoxMDA0NC….9z",
                                        "luz": 132.4,
                                        "nitidez": 41.2
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — fotografias"
                ],
                "operationId": "portalEnviarFoto",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/inicio": {
            "get": {
                "summary": "Resumo do início do portal",
                "description": "Próxima marcação, fase e progresso da recuperação, contadores (mensagens, documentos, autorizações, fotografias, notificações), saldo, jornada e últimas novidades. Cada bloco vem vazio (null) quando a funcionalidade está desligada pela clínica ou o módulo ainda não existe.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "paciente": {
                                                    "type": "object"
                                                },
                                                "clinica": {
                                                    "type": "object"
                                                },
                                                "boas_vindas": {
                                                    "type": "string"
                                                },
                                                "jornada": {
                                                    "type": "object",
                                                    "properties": {
                                                        "etapa": {
                                                            "type": "integer",
                                                            "minimum": 1,
                                                            "maximum": 9
                                                        },
                                                        "episodio_id": {
                                                            "type": [
                                                                "integer",
                                                                "null"
                                                            ]
                                                        },
                                                        "titulo": {
                                                            "type": [
                                                                "string",
                                                                "null"
                                                            ]
                                                        }
                                                    }
                                                },
                                                "proxima_marcacao": {
                                                    "oneOf": [
                                                        {
                                                            "$ref": "#/components/schemas/PortalMarcacao"
                                                        },
                                                        {
                                                            "type": "null"
                                                        }
                                                    ]
                                                },
                                                "recuperacao": {
                                                    "type": [
                                                        "object",
                                                        "null"
                                                    ]
                                                },
                                                "contadores": {
                                                    "type": "object",
                                                    "properties": {
                                                        "mensagens": {
                                                            "type": "integer"
                                                        },
                                                        "documentos": {
                                                            "type": "integer"
                                                        },
                                                        "consentimentos": {
                                                            "type": "integer"
                                                        },
                                                        "fotos": {
                                                            "type": "integer"
                                                        },
                                                        "notificacoes": {
                                                            "type": "integer"
                                                        }
                                                    }
                                                },
                                                "saldo": {
                                                    "$ref": "#/components/schemas/PortalSaldo"
                                                },
                                                "novidades": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/PortalNovidade"
                                                    }
                                                },
                                                "funcionalidades": {
                                                    "type": "object",
                                                    "additionalProperties": {
                                                        "type": "boolean"
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "paciente": {
                                            "primeiro_nome": "Rita",
                                            "nome_completo": "Rita Matos",
                                            "numero": "P-2026-00012"
                                        },
                                        "proxima_marcacao": {
                                            "id": 812,
                                            "inicio": "2026-11-04T10:30:00+00:00",
                                            "fim": "2026-11-04T11:00:00+00:00",
                                            "estado": "marcada",
                                            "estado_rotulo": "Marcada",
                                            "tom": "info",
                                            "tipo": {
                                                "id": 3,
                                                "nome": "Consulta de controlo",
                                                "teleconsulta": false,
                                                "cor": "#2D5C8A"
                                            },
                                            "profissional": "Dr.ª Inês Valente",
                                            "profissional_id": 7,
                                            "origem": "portal",
                                            "pode_confirmar": true,
                                            "pode_alterar": true,
                                            "pode_cancelar": true,
                                            "limite_alteracao": "2026-11-03T10:30:00+00:00",
                                            "politica": "Cancelamentos até 24 h antes.",
                                            "antecedencia_h": 24,
                                            "teleconsulta": null
                                        },
                                        "contadores": {
                                            "mensagens": 1,
                                            "documentos": 2,
                                            "consentimentos": 1,
                                            "fotos": 0,
                                            "notificacoes": 3
                                        },
                                        "jornada": {
                                            "etapa": 5,
                                            "episodio_id": 19,
                                            "titulo": "FUE couro cabeludo"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — início"
                ],
                "operationId": "portalInicio",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/marcacoes": {
            "get": {
                "summary": "Marcações do paciente",
                "description": "Próximas (ordem crescente) e passadas (decrescente), com as ações permitidas pela política (pode_confirmar, pode_alterar, pode_cancelar, limite_alteracao) e o estado da teleconsulta.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "disponivel": {
                                                    "type": "boolean"
                                                },
                                                "proximas": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/PortalMarcacao"
                                                    }
                                                },
                                                "passadas": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/PortalMarcacao"
                                                    }
                                                },
                                                "pode_marcar": {
                                                    "type": "boolean"
                                                },
                                                "politica": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "disponivel": true,
                                        "proximas": [
                                            {
                                                "id": 812,
                                                "inicio": "2026-11-04T10:30:00+00:00",
                                                "fim": "2026-11-04T11:00:00+00:00",
                                                "estado": "marcada",
                                                "estado_rotulo": "Marcada",
                                                "tom": "info",
                                                "tipo": {
                                                    "id": 3,
                                                    "nome": "Consulta de controlo",
                                                    "teleconsulta": false,
                                                    "cor": "#2D5C8A"
                                                },
                                                "profissional": "Dr.ª Inês Valente",
                                                "profissional_id": 7,
                                                "origem": "portal",
                                                "pode_confirmar": true,
                                                "pode_alterar": true,
                                                "pode_cancelar": true,
                                                "limite_alteracao": "2026-11-03T10:30:00+00:00",
                                                "politica": "Cancelamentos até 24 h antes.",
                                                "antecedencia_h": 24,
                                                "teleconsulta": null
                                            }
                                        ],
                                        "passadas": [],
                                        "pode_marcar": true,
                                        "politica": ""
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — marcações"
                ],
                "operationId": "portalMarcacoes",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            },
            "post": {
                "summary": "Marcar numa vaga",
                "description": "A hora tem de ser uma das vagas devolvidas por GET /portal/marcacoes/vagas (confirmado de novo no servidor). Criada por Agenda\\Marcacoes::criar (conflitos, horários, margens) com origem «portal». Efeitos: aviso à receção, linha do tempo, auditoria; o M6 dispara marcacao.criada.",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "tipo_id": {
                                        "type": "integer"
                                    },
                                    "inicio": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "profissional_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "notas": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "maxLength": 500
                                    }
                                },
                                "required": [
                                    "tipo_id",
                                    "inicio"
                                ]
                            },
                            "example": {
                                "tipo_id": 3,
                                "inicio": "2026-11-04T10:30:00+00:00",
                                "profissional_id": 7,
                                "notas": null
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PortalMarcacao"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 812,
                                        "inicio": "2026-11-04T10:30:00+00:00",
                                        "fim": "2026-11-04T11:00:00+00:00",
                                        "estado": "marcada",
                                        "estado_rotulo": "Marcada",
                                        "tom": "info",
                                        "tipo": {
                                            "id": 3,
                                            "nome": "Consulta de controlo",
                                            "teleconsulta": false,
                                            "cor": "#2D5C8A"
                                        },
                                        "profissional": "Dr.ª Inês Valente",
                                        "profissional_id": 7,
                                        "origem": "portal",
                                        "pode_confirmar": true,
                                        "pode_alterar": true,
                                        "pode_cancelar": true,
                                        "limite_alteracao": "2026-11-03T10:30:00+00:00",
                                        "politica": "Cancelamentos até 24 h antes.",
                                        "antecedencia_h": 24,
                                        "teleconsulta": null
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — marcações"
                ],
                "operationId": "portalMarcar",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/marcacoes/tipos": {
            "get": {
                "summary": "Tipos que se podem marcar online",
                "description": "Tipos ativos com «online» ligado (nunca cirurgias); teleconsultas só se a funcionalidade estiver ligada.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/PortalTipoMarcacao"
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 3,
                                            "nome": "Consulta de controlo",
                                            "duracao_min": 30,
                                            "teleconsulta": false,
                                            "exige_sinal": false,
                                            "valor_sinal": null,
                                            "politica_cancelamento": null,
                                            "antecedencia_h": 24,
                                            "cor": "#2D5C8A"
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — marcações"
                ],
                "operationId": "portalTiposMarcacao",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/marcacoes/vagas": {
            "get": {
                "summary": "Vagas de um tipo",
                "description": "Vagas entre duas datas (máx. 45 dias, nunca no passado, com a antecedência mínima portal.marcar_antecedencia_horas). Fonte: Agenda\\Marcacoes::disponibilidade.",
                "parameters": [
                    {
                        "name": "tipo_id",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "de",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "profissional_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/PortalVaga"
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "inicio": "2026-11-04T10:30:00+00:00",
                                            "fim": "2026-11-04T11:00:00+00:00",
                                            "profissional_id": 7,
                                            "profissional": "Dr.ª Inês Valente"
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — marcações"
                ],
                "operationId": "portalVagas",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/marcacoes/{id}": {
            "get": {
                "summary": "Detalhe de uma marcação",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Identificador"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PortalMarcacao"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 812,
                                        "inicio": "2026-11-04T10:30:00+00:00",
                                        "fim": "2026-11-04T11:00:00+00:00",
                                        "estado": "marcada",
                                        "estado_rotulo": "Marcada",
                                        "tom": "info",
                                        "tipo": {
                                            "id": 3,
                                            "nome": "Consulta de controlo",
                                            "teleconsulta": false,
                                            "cor": "#2D5C8A"
                                        },
                                        "profissional": "Dr.ª Inês Valente",
                                        "profissional_id": 7,
                                        "origem": "portal",
                                        "pode_confirmar": true,
                                        "pode_alterar": true,
                                        "pode_cancelar": true,
                                        "limite_alteracao": "2026-11-03T10:30:00+00:00",
                                        "politica": "Cancelamentos até 24 h antes.",
                                        "antecedencia_h": 24,
                                        "teleconsulta": null
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — marcações"
                ],
                "operationId": "portalMarcacao",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/marcacoes/{id}/cancelar": {
            "post": {
                "summary": "Cancelar dentro da política",
                "description": "Até limite_alteracao (antecedência do tipo ou portal.alterar_antecedencia_horas). Depois: 409 «fora_da_politica». Efeitos: aviso à receção, linha do tempo, auditoria.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Identificador"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "maxLength": 300
                                    }
                                }
                            },
                            "example": {
                                "motivo": "Viagem de trabalho"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PortalMarcacao"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 812,
                                        "inicio": "2026-11-04T10:30:00+00:00",
                                        "fim": "2026-11-04T11:00:00+00:00",
                                        "estado": "cancelada",
                                        "estado_rotulo": "Cancelada",
                                        "tom": "info",
                                        "tipo": {
                                            "id": 3,
                                            "nome": "Consulta de controlo",
                                            "teleconsulta": false,
                                            "cor": "#2D5C8A"
                                        },
                                        "profissional": "Dr.ª Inês Valente",
                                        "profissional_id": 7,
                                        "origem": "portal",
                                        "pode_confirmar": false,
                                        "pode_alterar": false,
                                        "pode_cancelar": false,
                                        "limite_alteracao": "2026-11-03T10:30:00+00:00",
                                        "politica": "Cancelamentos até 24 h antes.",
                                        "antecedencia_h": 24,
                                        "teleconsulta": null
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — marcações"
                ],
                "operationId": "portalCancelarMarcacao",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/marcacoes/{id}/confirmar": {
            "post": {
                "summary": "Confirmar presença",
                "description": "Só marcações «marcada» futuras → «confirmada» (confirmada_em, canal portal).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Identificador"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PortalMarcacao"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 812,
                                        "inicio": "2026-11-04T10:30:00+00:00",
                                        "fim": "2026-11-04T11:00:00+00:00",
                                        "estado": "confirmada",
                                        "estado_rotulo": "Confirmada",
                                        "tom": "info",
                                        "tipo": {
                                            "id": 3,
                                            "nome": "Consulta de controlo",
                                            "teleconsulta": false,
                                            "cor": "#2D5C8A"
                                        },
                                        "profissional": "Dr.ª Inês Valente",
                                        "profissional_id": 7,
                                        "origem": "portal",
                                        "pode_confirmar": false,
                                        "pode_alterar": true,
                                        "pode_cancelar": true,
                                        "limite_alteracao": "2026-11-03T10:30:00+00:00",
                                        "politica": "Cancelamentos até 24 h antes.",
                                        "antecedencia_h": 24,
                                        "teleconsulta": null
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — marcações"
                ],
                "operationId": "portalConfirmarMarcacao",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/marcacoes/{id}/remarcar": {
            "post": {
                "summary": "Remarcar para outra vaga",
                "description": "Cria a nova marcação (mesmas regras de POST /portal/marcacoes) com remarcada_de e fecha a anterior como «remarcada». Devolve a nova marcação.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Identificador"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "inicio": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "profissional_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "inicio"
                                ]
                            },
                            "example": {
                                "inicio": "2026-11-06T15:00:00+00:00",
                                "profissional_id": 7
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PortalMarcacao"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 815,
                                        "inicio": "2026-11-06T15:00:00+00:00",
                                        "fim": "2026-11-04T11:00:00+00:00",
                                        "estado": "marcada",
                                        "estado_rotulo": "Marcada",
                                        "tom": "info",
                                        "tipo": {
                                            "id": 3,
                                            "nome": "Consulta de controlo",
                                            "teleconsulta": false,
                                            "cor": "#2D5C8A"
                                        },
                                        "profissional": "Dr.ª Inês Valente",
                                        "profissional_id": 7,
                                        "origem": "portal",
                                        "pode_confirmar": true,
                                        "pode_alterar": true,
                                        "pode_cancelar": true,
                                        "limite_alteracao": "2026-11-03T10:30:00+00:00",
                                        "politica": "Cancelamentos até 24 h antes.",
                                        "antecedencia_h": 24,
                                        "teleconsulta": null
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — marcações"
                ],
                "operationId": "portalRemarcar",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/marcacoes/{id}/teleconsulta": {
            "post": {
                "summary": "Entrar na sala de espera da teleconsulta",
                "description": "A sala abre portal.teleconsulta_minutos_antes antes da hora. Passa a teleconsulta a «sala_espera», avisa o médico e devolve o endereço https da sala (fornecedor de vídeo do M6). 409 «sala_por_preparar» se a sala ainda não existir.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Identificador"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "url": {
                                                    "type": "string"
                                                },
                                                "estado": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "url": "https://video.anagen.pt/sala/8f2c1e",
                                        "estado": "sala_espera"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — marcações"
                ],
                "operationId": "portalEntrarTeleconsulta",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/mensagens": {
            "get": {
                "summary": "Conversa com a equipa",
                "description": "Mensagens do canal «portal» (entrada e saída — nunca notas internas), mais antigas primeiro; com ?desde=<id> só as novas. Abrir marca as mensagens da equipa como lidas. Inclui o tempo de resposta indicado.",
                "parameters": [
                    {
                        "name": "desde",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "disponivel": {
                                                    "type": "boolean"
                                                },
                                                "mensagens": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/PortalMensagem"
                                                    }
                                                },
                                                "resposta": {
                                                    "type": "object",
                                                    "properties": {
                                                        "horas": {
                                                            "type": "integer",
                                                            "x-unidade": "h"
                                                        },
                                                        "horario": {
                                                            "type": "string"
                                                        },
                                                        "urgencia": {
                                                            "type": "string"
                                                        }
                                                    }
                                                },
                                                "clinica": {
                                                    "type": "object"
                                                },
                                                "ultimo_id": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "disponivel": true,
                                        "mensagens": [
                                            {
                                                "id": 731,
                                                "minha": false,
                                                "autor": "Enf.ª Sofia Lima",
                                                "corpo": "Bom dia! As crostas caem normalmente até ao 10.º dia.",
                                                "anexos": [],
                                                "estado": "lida",
                                                "criado_em": "2026-10-28T09:40:00+00:00"
                                            }
                                        ],
                                        "resposta": {
                                            "horas": 24,
                                            "horario": "dias úteis, 9h–19h",
                                            "urgencia": "Em caso de urgência…"
                                        },
                                        "ultimo_id": 731
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — mensagens"
                ],
                "operationId": "portalMensagens",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            },
            "post": {
                "summary": "Enviar uma mensagem",
                "description": "Corpo 2–4000 caracteres; até 5 anexos carregados antes em /portal/mensagens/anexos. Entrada por Crm\\Conversas::registarEntrada (triagem, SLA, atribuição); sem ele, grava na conversa e avisa a receção. urgente = true cria uma tarefa urgente (portal.departamento_urgencias).",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "corpo": {
                                        "type": "string",
                                        "minLength": 2,
                                        "maxLength": 4000
                                    },
                                    "anexos": {
                                        "type": "array",
                                        "items": {
                                            "type": "integer"
                                        }
                                    },
                                    "urgente": {
                                        "type": "boolean"
                                    }
                                },
                                "required": [
                                    "corpo"
                                ]
                            },
                            "example": {
                                "corpo": "Bom dia, posso lavar a cabeça amanhã?",
                                "anexos": [],
                                "urgente": false
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "disponivel": true,
                                        "mensagens": [
                                            {
                                                "id": 731,
                                                "minha": false,
                                                "autor": "Enf.ª Sofia Lima",
                                                "corpo": "Bom dia! As crostas caem normalmente até ao 10.º dia.",
                                                "anexos": [],
                                                "estado": "lida",
                                                "criado_em": "2026-10-28T09:40:00+00:00"
                                            }
                                        ],
                                        "ultimo_id": 732
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — mensagens"
                ],
                "operationId": "portalEnviarMensagem",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/mensagens/anexos": {
            "post": {
                "summary": "Carregar um anexo",
                "description": "Imagem, PDF ou documento até 15 MB, cifrado; devolve o id a usar em «anexos».",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ficheiro"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "nome": {
                                                    "type": "string"
                                                },
                                                "tipo": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 10220,
                                        "nome": "penso.jpg",
                                        "tipo": "imagem"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — mensagens"
                ],
                "operationId": "portalAnexoMensagem",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/novidades": {
            "get": {
                "summary": "Novidades (notificações) do paciente",
                "description": "Notificações do paciente, mais recentes primeiro, com a ligação para a web e para a app. Sem conteúdo clínico. meta.por_ler e meta.contadores para os números do menu.",
                "parameters": [
                    {
                        "name": "pagina",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "por_pagina",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "maximum": 100
                        }
                    },
                    {
                        "name": "por_ler",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "enum": [
                                0,
                                1
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/PortalNovidade"
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "pagina": {
                                                    "type": "integer"
                                                },
                                                "por_pagina": {
                                                    "type": "integer"
                                                },
                                                "total": {
                                                    "type": "integer"
                                                },
                                                "por_ler": {
                                                    "type": "integer"
                                                },
                                                "contadores": {
                                                    "type": "object"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 3311,
                                            "tipo": "mensagem_portal",
                                            "titulo": "Tem uma mensagem nova da clínica",
                                            "corpo": "",
                                            "ligacao": {
                                                "web": "portal/mensagens",
                                                "app": "/e/portal_mensagens"
                                            },
                                            "lida_em": null,
                                            "criado_em": "2026-10-28T09:40:00+00:00"
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — início"
                ],
                "operationId": "portalNovidades",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/pagamentos": {
            "get": {
                "summary": "Saldo, pagamentos e faturas",
                "description": "Saldo (propostas aceites − pagamentos recebidos), pagamentos (com referência Multibanco quando existe) e faturas emitidas com o PDF. Métodos disponíveis: os de portal.pagamentos_metodos com o serviço de pagamentos ativo.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "saldo": {
                                                    "$ref": "#/components/schemas/PortalSaldo"
                                                },
                                                "pagamentos": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/PortalPagamento"
                                                    }
                                                },
                                                "faturas": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/PortalFatura"
                                                    }
                                                },
                                                "metodos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string",
                                                        "enum": [
                                                            "mbway",
                                                            "multibanco",
                                                            "ligacao"
                                                        ]
                                                    }
                                                },
                                                "pode_pagar": {
                                                    "type": "boolean"
                                                },
                                                "aviso": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "saldo": {
                                            "total_aceite": 4980,
                                            "pago": 0,
                                            "em_divida": 4980,
                                            "pendente": 500,
                                            "pendentes": 1,
                                            "moeda": "EUR",
                                            "pct_pago": 0
                                        },
                                        "pagamentos": [
                                            {
                                                "id": 204,
                                                "tipo": "sinal",
                                                "tipo_rotulo": "Sinal",
                                                "valor": 500,
                                                "moeda": "EUR",
                                                "metodo": "multibanco",
                                                "metodo_rotulo": "Referência Multibanco",
                                                "estado": "pendente",
                                                "estado_rotulo": "Por pagar",
                                                "tom": "aviso",
                                                "mb_entidade": "21423",
                                                "mb_referencia": "123456789",
                                                "mb_validade": "2026-11-05T23:59:00+00:00",
                                                "telefone": null,
                                                "vence_em": "2026-11-05",
                                                "pago_em": null,
                                                "pode_pagar": true,
                                                "fatura": null
                                            }
                                        ],
                                        "faturas": [
                                            {
                                                "id": 88,
                                                "tipo": "FR",
                                                "numero": "FR A/2026/88",
                                                "atcud": "JJ37MMBR-88",
                                                "total": 80,
                                                "iva": 0,
                                                "descricao": "Consulta de avaliação",
                                                "emitido_em": "2026-10-02T15:20:00+00:00",
                                                "url": "https://anagen.pt/f/eyJmIjo4ODAx….q"
                                            }
                                        ],
                                        "metodos": [
                                            "mbway",
                                            "multibanco"
                                        ],
                                        "pode_pagar": true,
                                        "aviso": ""
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — pagamentos"
                ],
                "operationId": "portalPagamentos",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            },
            "post": {
                "summary": "Pagar (MB WAY, Multibanco ou ligação)",
                "description": "Um pagamento pendente (pagamento_id) ou um valor livre até ao valor em dívida (valor). MB WAY exige telefone português (9 algarismos). Uma referência Multibanco ainda válida é devolvida sem criar outra. Comercial\\Pagamentos::criar (M5) gera a referência/pedido/ligação; o portal nunca recebe dados de cartão.",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "pagamento_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "valor": {
                                        "type": [
                                            "number",
                                            "null"
                                        ],
                                        "x-unidade": "EUR"
                                    },
                                    "metodo": {
                                        "type": "string",
                                        "enum": [
                                            "mbway",
                                            "multibanco",
                                            "ligacao"
                                        ]
                                    },
                                    "telefone": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "metodo"
                                ]
                            },
                            "example": {
                                "pagamento_id": 204,
                                "metodo": "mbway",
                                "telefone": "912345678"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PortalInstrucoesPagamento"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "pagamento_id": 204,
                                        "metodo": "mbway",
                                        "valor": 500,
                                        "mb_entidade": null,
                                        "mb_referencia": null,
                                        "mb_validade": null,
                                        "url": null,
                                        "mensagem": "Aceite o pedido na aplicação MB WAY nos próximos minutos."
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — pagamentos"
                ],
                "operationId": "portalPagar",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/pagamentos/{id}/pagar": {
            "post": {
                "tags": [
                    "Portal — propostas e pagamentos"
                ],
                "operationId": "m5PortalPagar",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Pagar",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "metodo": {
                                        "type": "string",
                                        "enum": [
                                            "mbway",
                                            "multibanco",
                                            "ligacao"
                                        ]
                                    },
                                    "telefone": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "metodo"
                                ]
                            },
                            "example": {
                                "metodo": "mbway",
                                "telefone": "912345678"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5PagamentoPaciente"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/portal/plano": {
            "get": {
                "summary": "O meu plano: planos aprovados, modelos 3D e propostas",
                "description": "Só o que o médico partilhou: planos com estado «aprovado» (sem notas clínicas), modelos 3D cujo ficheiro está partilhado e propostas enviadas. Interruptores: portal.mostrar_plano, _modelo3d, _simulacao, _propostas.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "planos": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/PortalPlano"
                                                    }
                                                },
                                                "propostas": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/PortalProposta"
                                                    }
                                                },
                                                "modelos3d": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "aviso": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "planos": [
                                            {
                                                "id": 41,
                                                "versao": 2,
                                                "episodio": {
                                                    "id": 19,
                                                    "titulo": "FUE couro cabeludo",
                                                    "numero": "E-2026-0019",
                                                    "etapa": 5
                                                },
                                                "tecnica": "FUE",
                                                "enxertos_necessarios": 2850,
                                                "sessoes": 1,
                                                "cenario": "provavel",
                                                "cenario_rotulo": "Provável",
                                                "aprovado_em": "2026-10-20T16:05:00+00:00",
                                                "aprovado_por": "Dr. Rui Matos",
                                                "zonas": [
                                                    {
                                                        "zona": "linha_frontal",
                                                        "zona_rotulo": "Linha frontal",
                                                        "area_cm2": 18.5,
                                                        "densidade_alvo": 45,
                                                        "enxertos": 830
                                                    },
                                                    {
                                                        "zona": "frontal",
                                                        "zona_rotulo": "Zona frontal",
                                                        "area_cm2": 52,
                                                        "densidade_alvo": 38,
                                                        "enxertos": 1976
                                                    }
                                                ],
                                                "area_total_cm2": 70.5,
                                                "simulacao": {
                                                    "disponivel": true,
                                                    "aviso_aceite_em": null,
                                                    "url": null
                                                }
                                            }
                                        ],
                                        "propostas": [
                                            {
                                                "id": 77,
                                                "numero": "PR-2026-0077",
                                                "estado": "vista",
                                                "estado_rotulo": "Vista",
                                                "total": 4980,
                                                "moeda": "EUR",
                                                "validade_ate": "2026-11-30",
                                                "enviada_em": "2026-10-21T09:00:00+00:00",
                                                "aceite_em": null,
                                                "pode_aceitar": true,
                                                "pdf_url": "https://anagen.pt/f/eyJmIjo5MTIs….Xk2",
                                                "linhas": [
                                                    {
                                                        "descricao": "Transplante FUE — 2850 enxertos",
                                                        "quantidade": 2850,
                                                        "unidade": "enxertos",
                                                        "valor": 4980
                                                    }
                                                ],
                                                "opcoes": [],
                                                "subtotal": 4980,
                                                "desconto_valor": null,
                                                "iva_valor": null,
                                                "prestacoes": [
                                                    {
                                                        "descricao": "Sinal",
                                                        "valor": 500,
                                                        "data": "2026-11-05"
                                                    }
                                                ],
                                                "opcao_aceite": null,
                                                "plano_id": 41
                                            }
                                        ],
                                        "modelos3d": [
                                            {
                                                "id": 8,
                                                "formato": "glb",
                                                "ficheiro_id": 9001,
                                                "nome": "captura.glb",
                                                "tamanho": 4810233,
                                                "data": "2026-10-15T10:00:00+00:00",
                                                "visualizavel": true
                                            }
                                        ],
                                        "aviso": "Ilustrativo, sem garantia de resultado."
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — plano"
                ],
                "operationId": "portalPlano",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/plano/modelos3d/{id}": {
            "get": {
                "summary": "Ligação ao modelo 3D partilhado",
                "description": "Devolve uma ligação assinada de 30 minutos ao ficheiro (GLB, PLY, OBJ, STL ou USDZ). A leitura fica na auditoria.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Modelo 3D"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "formato": {
                                                    "type": "string"
                                                },
                                                "url": {
                                                    "type": "string"
                                                },
                                                "nome": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 8,
                                        "formato": "glb",
                                        "url": "https://anagen.pt/f/eyJmIjo5MDAx….m",
                                        "nome": "captura.glb"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — plano"
                ],
                "operationId": "portalModelo3d",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/plano/{id}/simulacao": {
            "post": {
                "summary": "Aceitar o aviso da simulação e obter a imagem",
                "description": "Regista a tomada de conhecimento «Ilustrativo, sem garantia de resultado» (planos.simulacao_aviso_aceite_em, prova em portal_leituras e auditoria) e devolve o plano com simulacao.url (15 min). Efeitos: linha do tempo do paciente.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Plano"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PortalPlano"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 41,
                                        "versao": 2,
                                        "episodio": {
                                            "id": 19,
                                            "titulo": "FUE couro cabeludo",
                                            "numero": "E-2026-0019",
                                            "etapa": 5
                                        },
                                        "tecnica": "FUE",
                                        "enxertos_necessarios": 2850,
                                        "sessoes": 1,
                                        "cenario": "provavel",
                                        "cenario_rotulo": "Provável",
                                        "aprovado_em": "2026-10-20T16:05:00+00:00",
                                        "aprovado_por": "Dr. Rui Matos",
                                        "zonas": [
                                            {
                                                "zona": "linha_frontal",
                                                "zona_rotulo": "Linha frontal",
                                                "area_cm2": 18.5,
                                                "densidade_alvo": 45,
                                                "enxertos": 830
                                            },
                                            {
                                                "zona": "frontal",
                                                "zona_rotulo": "Zona frontal",
                                                "area_cm2": 52,
                                                "densidade_alvo": 38,
                                                "enxertos": 1976
                                            }
                                        ],
                                        "area_total_cm2": 70.5,
                                        "simulacao": {
                                            "disponivel": true,
                                            "aviso_aceite_em": "2026-10-28T10:15:00+00:00",
                                            "url": "https://anagen.pt/f/eyJmIjo5NTUx….k"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — plano"
                ],
                "operationId": "portalAceitarAvisoSimulacao",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/propostas": {
            "get": {
                "tags": [
                    "Portal — propostas e pagamentos"
                ],
                "operationId": "m5PortalPropostas",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente",
                "summary": "As minhas propostas",
                "description": "Só propostas enviadas ao próprio paciente (nunca rascunhos).",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "integer"
                                                    },
                                                    "numero": {
                                                        "type": "string"
                                                    },
                                                    "titulo": {
                                                        "type": "string"
                                                    },
                                                    "estado": {
                                                        "type": "string",
                                                        "enum": [
                                                            "rascunho",
                                                            "enviada",
                                                            "vista",
                                                            "aceite",
                                                            "recusada",
                                                            "expirada"
                                                        ]
                                                    },
                                                    "estado_rotulo": {
                                                        "type": "string"
                                                    },
                                                    "total": {
                                                        "type": "number",
                                                        "x-unidade": "EUR"
                                                    },
                                                    "moeda": {
                                                        "type": "string"
                                                    },
                                                    "validade_ate": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ],
                                                        "format": "date"
                                                    },
                                                    "enviada_em": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ],
                                                        "format": "date-time"
                                                    },
                                                    "aceite_em": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ],
                                                        "format": "date-time"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/portal/propostas/{id}": {
            "get": {
                "summary": "Detalhe de uma proposta",
                "description": "Linhas, opções, totais, prestações e PDF. A primeira abertura marca a proposta como «vista» (vista_em) e regista a leitura.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Proposta"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PortalProposta"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 77,
                                        "numero": "PR-2026-0077",
                                        "estado": "vista",
                                        "estado_rotulo": "Vista",
                                        "total": 4980,
                                        "moeda": "EUR",
                                        "validade_ate": "2026-11-30",
                                        "enviada_em": "2026-10-21T09:00:00+00:00",
                                        "aceite_em": null,
                                        "pode_aceitar": true,
                                        "pdf_url": "https://anagen.pt/f/eyJmIjo5MTIs….Xk2",
                                        "linhas": [
                                            {
                                                "descricao": "Transplante FUE — 2850 enxertos",
                                                "quantidade": 2850,
                                                "unidade": "enxertos",
                                                "valor": 4980
                                            }
                                        ],
                                        "opcoes": [],
                                        "subtotal": 4980,
                                        "desconto_valor": null,
                                        "iva_valor": null,
                                        "prestacoes": [
                                            {
                                                "descricao": "Sinal",
                                                "valor": 500,
                                                "data": "2026-11-05"
                                            }
                                        ],
                                        "opcao_aceite": null,
                                        "plano_id": 41
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — plano"
                ],
                "operationId": "portalProposta",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/propostas/{id}/aceitar": {
            "post": {
                "summary": "Aceitar uma proposta com assinatura",
                "description": "Exige aceito = true, a assinatura (PNG em base64 ou data URL) e a opção quando a proposta tem opções. Usa Comercial\\Propostas::aceitar quando existe; senão regista a aceitação, processa comissões e dispara o webhook proposta.aceite. Efeitos: notificação ao responsável comercial, linha do tempo, auditoria «assinar».",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Proposta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "aceito": {
                                        "type": "boolean"
                                    },
                                    "assinatura": {
                                        "type": "string",
                                        "contentEncoding": "base64",
                                        "contentMediaType": "image/png"
                                    },
                                    "opcao": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "aceito",
                                    "assinatura"
                                ]
                            },
                            "example": {
                                "aceito": true,
                                "assinatura": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA…",
                                "opcao": null
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PortalProposta"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 77,
                                        "numero": "PR-2026-0077",
                                        "estado": "aceite",
                                        "estado_rotulo": "Aceite",
                                        "total": 4980,
                                        "moeda": "EUR",
                                        "validade_ate": "2026-11-30",
                                        "enviada_em": "2026-10-21T09:00:00+00:00",
                                        "aceite_em": "2026-10-28T10:20:00+00:00",
                                        "pode_aceitar": false,
                                        "pdf_url": "https://anagen.pt/f/eyJmIjo5MTIs….Xk2",
                                        "linhas": [
                                            {
                                                "descricao": "Transplante FUE — 2850 enxertos",
                                                "quantidade": 2850,
                                                "unidade": "enxertos",
                                                "valor": 4980
                                            }
                                        ],
                                        "opcoes": [],
                                        "subtotal": 4980,
                                        "desconto_valor": null,
                                        "iva_valor": null,
                                        "prestacoes": [
                                            {
                                                "descricao": "Sinal",
                                                "valor": 500,
                                                "data": "2026-11-05"
                                            }
                                        ],
                                        "opcao_aceite": null,
                                        "plano_id": 41
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — plano"
                ],
                "operationId": "portalAceitarProposta",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/propostas/{id}/recusar": {
            "post": {
                "tags": [
                    "Portal — propostas e pagamentos"
                ],
                "operationId": "m5PortalRecusar",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Recusar",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M5PropostaPublica"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/portal/recuperacao": {
            "get": {
                "summary": "Linha temporal e instruções da recuperação",
                "description": "Cirurgia, marcos (marcos_acompanhamento ou calendário calculado), fase atual, progresso, conteúdos da fase (base de conhecimento, blocos do site ou instruções gerais; vídeos só da própria clínica) e instruções da alta (sem medicação).",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "cirurgia": {
                                                    "type": [
                                                        "object",
                                                        "null"
                                                    ]
                                                },
                                                "marcos": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/PortalMarco"
                                                    }
                                                },
                                                "fase": {
                                                    "type": "object"
                                                },
                                                "progresso": {
                                                    "type": "object",
                                                    "properties": {
                                                        "feitos": {
                                                            "type": "integer"
                                                        },
                                                        "total": {
                                                            "type": "integer"
                                                        },
                                                        "pct": {
                                                            "type": "integer",
                                                            "x-unidade": "%"
                                                        }
                                                    }
                                                },
                                                "fases": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "conteudos": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/PortalConteudoFase"
                                                    }
                                                },
                                                "alta": {
                                                    "type": [
                                                        "object",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "cirurgia": {
                                            "id": 31,
                                            "data": "2026-10-20T08:00:00+00:00",
                                            "tecnica": "FUE",
                                            "dias": 8
                                        },
                                        "marcos": [
                                            {
                                                "id": 66,
                                                "marco": "m1",
                                                "titulo": "1 mês",
                                                "data_prevista": "2026-11-20",
                                                "estado": "pendente",
                                                "estado_rotulo": "Por fazer",
                                                "feito": false,
                                                "passado": false,
                                                "pede_fotos": false,
                                                "marcacao_id": null,
                                                "calculado": false
                                            }
                                        ],
                                        "fase": {
                                            "chave": "s1",
                                            "titulo": "Primeira semana",
                                            "data": "2026-10-27"
                                        },
                                        "progresso": {
                                            "feitos": 1,
                                            "total": 8,
                                            "pct": 13
                                        },
                                        "conteudos": [
                                            {
                                                "origem": "geral",
                                                "titulo": "A primeira semana",
                                                "html": null,
                                                "itens": [
                                                    "Lave a cabeça apenas como lhe foi ensinado na primeira lavagem."
                                                ],
                                                "videos": []
                                            }
                                        ],
                                        "alta": null
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — recuperação"
                ],
                "operationId": "portalRecuperacao",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/portal/recuperacao/fases/{fase}": {
            "get": {
                "summary": "Conteúdos de uma fase",
                "parameters": [
                    {
                        "name": "fase",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "pre",
                                "d1",
                                "s1",
                                "m1",
                                "m2",
                                "m6",
                                "m9",
                                "m12",
                                "m18"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "chave": {
                                                    "type": "string"
                                                },
                                                "titulo": {
                                                    "type": "string"
                                                },
                                                "conteudos": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/PortalConteudoFase"
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "chave": "m1",
                                        "titulo": "1 mês",
                                        "conteudos": []
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Portal — recuperação"
                ],
                "operationId": "portalFaseRecuperacao",
                "security": [
                    {
                        "paciente": []
                    }
                ],
                "x-anagen-modulo": "portal",
                "x-anagen-nivel": "paciente"
            }
        },
        "/postman.json": {
            "get": {
                "tags": [
                    "Integrações"
                ],
                "operationId": "colecaoPostman",
                "security": [],
                "summary": "Coleção de testes (formato Postman 2.1)",
                "responses": {
                    "200": {
                        "description": "Coleção",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/primeiros-passos": {
            "get": {
                "tags": [
                    "Definições"
                ],
                "operationId": "primeirosPassos",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Primeiros passos da clínica (assistente de configuração)",
                "description": "Passos dados_legais, equipa, horarios, tipos_marcacao, consentimentos, motor, pagamentos, faturacao, email e canais, cada um com estado (feito|por_fazer|dispensado|nao_aplicavel), pormenor e ligacao {web, app}; o estado calcula-se a partir da configuração existente. Exige Definições › Editar.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "passos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "chave": {
                                                                "type": "string"
                                                            },
                                                            "titulo": {
                                                                "type": "string"
                                                            },
                                                            "descricao": {
                                                                "type": "string"
                                                            },
                                                            "acao": {
                                                                "type": "string"
                                                            },
                                                            "icone": {
                                                                "type": "string"
                                                            },
                                                            "estado": {
                                                                "type": "string"
                                                            },
                                                            "estado_rotulo": {
                                                                "type": "string"
                                                            },
                                                            "detalhe": {
                                                                "type": "string"
                                                            },
                                                            "feito": {
                                                                "type": "boolean"
                                                            },
                                                            "dispensavel": {
                                                                "type": "boolean"
                                                            },
                                                            "ligacao": {
                                                                "type": "object"
                                                            }
                                                        }
                                                    }
                                                },
                                                "total": {
                                                    "type": "integer"
                                                },
                                                "feitos": {
                                                    "type": "integer"
                                                },
                                                "em_falta": {
                                                    "type": "integer"
                                                },
                                                "percentagem": {
                                                    "type": "integer"
                                                },
                                                "concluido": {
                                                    "type": "boolean"
                                                },
                                                "proximo": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/primeiros-passos/{passo}/dispensar": {
            "post": {
                "tags": [
                    "Definições"
                ],
                "operationId": "dispensarPrimeiroPasso",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "passo",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "summary": "Dispensar (ou voltar a pedir) um passo",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "dispensar": {
                                        "type": "boolean"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/procurar": {
            "get": {
                "tags": [
                    "Sessão"
                ],
                "operationId": "procurar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "summary": "Pesquisa global",
                "description": "Pacientes, leads, registos e ecrãs que o perfil pode ver. Nunca devolve conteúdo clínico a perfis sem acesso.",
                "parameters": [
                    {
                        "name": "q",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "minLength": 2,
                            "maxLength": 80
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "tipo": {
                                                        "type": "string"
                                                    },
                                                    "titulo": {
                                                        "type": "string"
                                                    },
                                                    "subtitulo": {
                                                        "type": "string"
                                                    },
                                                    "url": {
                                                        "type": "string"
                                                    },
                                                    "icone": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    }
                }
            }
        },
        "/proposta/{token}": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "get": {
                "tags": [
                    "Proposta pública"
                ],
                "operationId": "m5PublicaVer",
                "security": [],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "publico",
                "summary": "Página da proposta (HTML)",
                "description": "Mostra a proposta com a marca e os dados legais da clínica dona do registo, em pt ou en (idioma da proposta ou ?lingua=). A primeira abertura marca «vista». Ligação inválida, revista ou expirada → página informativa.",
                "parameters": [
                    {
                        "name": "token",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^[a-f0-9]{64}$"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página HTML",
                        "content": {
                            "text/html": {
                                "schema": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ligação inválida"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/proposta/{token}/aceitar": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "post": {
                "tags": [
                    "Proposta pública"
                ],
                "operationId": "m5PublicaAceitar",
                "security": [],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "publico",
                "summary": "Aceitar (formulário)",
                "description": "Formulário com CSRF e campo armadilha; limite de 8 envios por 10 minutos. Verifica o selo, guarda a prova e cria o plano de pagamentos.",
                "parameters": [
                    {
                        "name": "token",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/x-www-form-urlencoded": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "opcao",
                                    "nome",
                                    "aceitar"
                                ],
                                "properties": {
                                    "opcao": {
                                        "type": "string"
                                    },
                                    "nome": {
                                        "type": "string"
                                    },
                                    "assinatura": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "prestacoes": {
                                        "type": "integer"
                                    },
                                    "aceitar": {
                                        "const": "1"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "303": {
                        "description": "Volta à página da proposta"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/proposta/{token}/estado": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "get": {
                "tags": [
                    "Proposta pública"
                ],
                "operationId": "m5PublicaEstado",
                "security": [],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "publico",
                "summary": "Estado dos pagamentos da proposta",
                "description": "Usado pela página para acompanhar o MB WAY: lista dos pagamentos (id, tipo, valor, estado).",
                "parameters": [
                    {
                        "name": "token",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/M5PagamentoPaciente"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/proposta/{token}/pagar": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "post": {
                "tags": [
                    "Proposta pública"
                ],
                "operationId": "m5PublicaPagar",
                "security": [],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "publico",
                "summary": "Pagar o próximo pagamento da proposta",
                "description": "Só o primeiro pagamento por pagar desta proposta, pelo fornecedor e credenciais da clínica dona. Ligação de pagamento → redireciona para a página do fornecedor.",
                "parameters": [
                    {
                        "name": "token",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/x-www-form-urlencoded": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "metodo"
                                ],
                                "properties": {
                                    "metodo": {
                                        "type": "string",
                                        "enum": [
                                            "mbway",
                                            "multibanco",
                                            "ligacao"
                                        ]
                                    },
                                    "telefone": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "303": {
                        "description": "Página da proposta ou do fornecedor"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/proposta/{token}/pdf": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "get": {
                "tags": [
                    "Proposta pública"
                ],
                "operationId": "m5PublicaPdf",
                "security": [],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "publico",
                "summary": "PDF da proposta",
                "parameters": [
                    {
                        "name": "token",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "PDF",
                        "content": {
                            "application/pdf": {
                                "schema": {
                                    "type": "string",
                                    "format": "binary"
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/proposta/{token}/recusar": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "post": {
                "tags": [
                    "Proposta pública"
                ],
                "operationId": "m5PublicaRecusar",
                "security": [],
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "publico",
                "summary": "Recusar (formulário)",
                "parameters": [
                    {
                        "name": "token",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/x-www-form-urlencoded": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "303": {
                        "description": "Volta à página da proposta"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/publico/apresentacao": {
            "get": {
                "summary": "Conteúdo da Apresentação do AnagenSys",
                "description": "Sem sessão. Devolve todas as secções da página de produto na língua pedida (pt ou en; outras línguas recebem inglês), as opções do formulário de demonstração, o selo de tempo e o nome do campo armadilha. Regista uma visita anónima (área «apresentacao»). Limite: 60 pedidos por minuto e por IP.",
                "parameters": [
                    {
                        "name": "lingua",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "pt",
                                "pt_BR",
                                "en",
                                "es",
                                "fr",
                                "de"
                            ]
                        },
                        "description": "Língua da app; sem ela usa-se o Accept-Language."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ApresentacaoConteudo"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "idioma": "pt",
                                        "seccoes": {
                                            "hero": {
                                                "hero_titulo": "Da primeira mensagem ao resultado aos 18 meses, *num só sistema*.",
                                                "hero_provas": [
                                                    {
                                                        "valor": "425",
                                                        "unidade": "",
                                                        "rotulo": "funcionalidades levantadas"
                                                    }
                                                ]
                                            },
                                            "funcionalidades": {
                                                "total": 425
                                            }
                                        },
                                        "formulario": {
                                            "especialidades": [
                                                {
                                                    "valor": "capilar",
                                                    "rotulo": "Cirurgia capilar"
                                                }
                                            ],
                                            "paises": [
                                                {
                                                    "valor": "PT",
                                                    "rotulo": "Portugal"
                                                }
                                            ]
                                        },
                                        "meta": {
                                            "titulo": "AnagenSys — plataforma clínica para cirurgia capilar",
                                            "descricao": "CRM, ficha clínica, planeamento…",
                                            "imagem": "https://anagen.pt/apresentacao/partilha.png"
                                        },
                                        "urls": {
                                            "pt": "https://anagen.pt/apresentacao",
                                            "en": "https://anagen.pt/en/presentation",
                                            "pdf": "https://anagen.pt/apresentacao/pdf",
                                            "desenvolvedores": "https://anagen.pt/desenvolvedores"
                                        },
                                        "selo": "MTczMDEwOTYwMC5hcHJlc2VudGFjYW8uOWYx…",
                                        "armadilha": "website_url"
                                    }
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Apresentação do AnagenSys"
                ],
                "operationId": "apresentacaoConteudo",
                "security": [],
                "x-anagen-modulo": "publico",
                "x-anagen-nivel": "publico"
            }
        },
        "/publico/apresentacao/pedido": {
            "post": {
                "summary": "Pedir uma demonstração do AnagenSys",
                "description": "Sem sessão. Valida por lista de valores, tipos e tamanhos; exige o consentimento de contacto. Proteções: limite de 5 envios por 10 minutos por IP, limite por hora nas definições, selo de tempo (_selo) e campo armadilha vazio — um robô recebe 201 sem nada gravado (id nulo). Efeitos: pedido no quadro da plataforma, aviso por notificação e por email, email de confirmação ao interessado e webhook «demonstracao.pedida».",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "nome": {
                                        "type": "string",
                                        "minLength": 2,
                                        "maxLength": 160
                                    },
                                    "clinica_nome": {
                                        "type": "string",
                                        "minLength": 2,
                                        "maxLength": 190
                                    },
                                    "cargo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "maxLength": 120
                                    },
                                    "email": {
                                        "type": "string",
                                        "format": "email",
                                        "maxLength": 190
                                    },
                                    "telefone": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "pattern": "^[0-9+() .-]{6,25}$"
                                    },
                                    "pais": {
                                        "type": "string",
                                        "pattern": "^[A-Z]{2}$"
                                    },
                                    "especialidade": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "enum": [
                                            "capilar",
                                            "dermatologia",
                                            "estetica",
                                            "cirurgia_plastica",
                                            "dentaria",
                                            "oftalmologia",
                                            "outra",
                                            null
                                        ]
                                    },
                                    "cirurgioes_n": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "minimum": 0,
                                        "maximum": 500
                                    },
                                    "cirurgias_mes": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "minimum": 0,
                                        "maximum": 5000
                                    },
                                    "sistemas_atuais": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "maxLength": 500
                                    },
                                    "mensagem": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "maxLength": 3000
                                    },
                                    "consentimento_contacto": {
                                        "const": true
                                    },
                                    "idioma": {
                                        "type": "string",
                                        "enum": [
                                            "pt",
                                            "en"
                                        ]
                                    },
                                    "utm_source": {
                                        "type": "string"
                                    },
                                    "utm_medium": {
                                        "type": "string"
                                    },
                                    "utm_campaign": {
                                        "type": "string"
                                    },
                                    "_selo": {
                                        "type": "string"
                                    },
                                    "website_url": {
                                        "type": "string",
                                        "maxLength": 0,
                                        "description": "Campo armadilha: tem de seguir vazio (o nome vem em «armadilha»)."
                                    }
                                },
                                "required": [
                                    "nome",
                                    "clinica_nome",
                                    "email",
                                    "pais",
                                    "consentimento_contacto",
                                    "_selo"
                                ]
                            },
                            "example": {
                                "nome": "Marta Ribeiro",
                                "clinica_nome": "Clínica Capilar do Norte",
                                "cargo": "Diretora clínica",
                                "email": "marta@capilarnorte.pt",
                                "telefone": "+351 912 345 678",
                                "pais": "PT",
                                "especialidade": "capilar",
                                "cirurgioes_n": 2,
                                "cirurgias_mes": 24,
                                "consentimento_contacto": true,
                                "idioma": "pt",
                                "_selo": "MTczMDEwOTYwMC5…",
                                "website_url": ""
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                },
                                                "titulo": {
                                                    "type": "string"
                                                },
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 58,
                                        "titulo": "Pedido recebido",
                                        "mensagem": "Obrigado. A equipa do produto contacta-o num dia útil para combinar a demonstração."
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Apresentação do AnagenSys"
                ],
                "operationId": "apresentacaoPedido",
                "security": [],
                "x-anagen-modulo": "publico",
                "x-anagen-nivel": "publico"
            }
        },
        "/publico/avisos/{contexto}": {
            "get": {
                "tags": [
                    "Consentimentos"
                ],
                "operationId": "m2AvisoPublico",
                "security": [],
                "x-anagen-modulo": "publico",
                "x-anagen-nivel": "publico",
                "parameters": [
                    {
                        "name": "contexto",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "pre_avaliacao",
                                "contacto_chamada",
                                "contacto_marcacao",
                                "contacto_reclamacao",
                                "portal_registo",
                                "demonstracao",
                                "formulario"
                            ]
                        }
                    },
                    {
                        "name": "lingua",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "pt, pt_BR, en, es, fr, de (sem versão nessa língua: inglês e depois português)."
                    },
                    {
                        "name": "X-AX-Clinica",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "summary": "Aviso de privacidade em vigor de um formulário",
                "description": "Sem sessão. Devolve o aviso versionado do canal do contexto (ou null) e o testemunho da versão mostrada; envie-o como «aviso_testemunho» no formulário para registar a exibição. «demonstracao» é sempre da clínica principal. Limite: 60 por minuto.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M2AvisoCanal"
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "contexto": {
                                                    "type": "string"
                                                },
                                                "canal": {
                                                    "type": "string"
                                                },
                                                "clinica_id": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/publico/chat": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "post": {
                "tags": [
                    "Chat do site e subscrições"
                ],
                "operationId": "chatSiteEnviar",
                "security": [],
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "publico",
                "summary": "Chat do site",
                "description": "Sem sessão; usado pelo widget do site (envia o código CSRF do site). Ações: iniciar (nome, email ou telefone, texto, consentimento → devolve o token da conversa), mensagem, disponibilidade (horários livres), marcar (pedido de marcação para a receção) e avaliar (1-5). Campo armadilha «website_url»: preenchido, a resposta parece de sucesso e nada é gravado. A clínica é a pública do site. Limite: 20 por minuto e por IP.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "acao": {
                                        "type": "string",
                                        "enum": [
                                            "iniciar",
                                            "mensagem",
                                            "marcar",
                                            "avaliar",
                                            "disponibilidade"
                                        ]
                                    },
                                    "token": {
                                        "type": "string",
                                        "pattern": "^[a-f0-9]{32}$"
                                    },
                                    "nome": {
                                        "type": "string",
                                        "maxLength": 160
                                    },
                                    "email": {
                                        "type": "string",
                                        "format": "email"
                                    },
                                    "telefone": {
                                        "type": "string",
                                        "maxLength": 30
                                    },
                                    "texto": {
                                        "type": "string",
                                        "maxLength": 2000
                                    },
                                    "consentimento": {
                                        "type": "boolean"
                                    },
                                    "preferencia": {
                                        "type": "string",
                                        "maxLength": 300
                                    },
                                    "inicio": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "nota": {
                                        "type": "integer",
                                        "minimum": 1,
                                        "maximum": 5
                                    },
                                    "website_url": {
                                        "type": "string",
                                        "maxLength": 0
                                    }
                                },
                                "required": [
                                    "acao"
                                ]
                            },
                            "example": {
                                "acao": "iniciar",
                                "nome": "Ana Lopes",
                                "email": "ana.lopes@exemplo.pt",
                                "texto": "Boa tarde, fazem implante de sobrancelhas?",
                                "consentimento": true,
                                "website_url": ""
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "token": {
                                                    "type": "string"
                                                },
                                                "mensagens": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "mensagem": {
                                                    "type": "string"
                                                },
                                                "horarios": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "token": "3f9c2e7a1b4d5c6e8f0a1b2c3d4e5f60",
                                        "mensagens": [
                                            {
                                                "id": 1,
                                                "direcao": "saida",
                                                "corpo": "Olá! Em que podemos ajudar?",
                                                "ia": false,
                                                "criado_em": "2026-10-28T15:01:00+00:00"
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/publico/chat/{token}": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "get": {
                "tags": [
                    "Chat do site e subscrições"
                ],
                "operationId": "chatSiteMensagens",
                "security": [],
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "publico",
                "summary": "Mensagens da conversa do site",
                "description": "Mensagens trocadas (sem notas internas), estado da conversa e se já pode avaliar. Só com o token devolvido em «iniciar» (guardado apenas como resumo criptográfico). Limite: 40 por minuto.",
                "parameters": [
                    {
                        "name": "token",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^[a-f0-9]{32}$"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagens": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "estado": {
                                                    "type": "string"
                                                },
                                                "pode_avaliar": {
                                                    "type": "boolean"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/publico/clinica": {
            "get": {
                "tags": [
                    "Clínica pública"
                ],
                "operationId": "clinicaPublica",
                "security": [],
                "summary": "Clínica pública resolvida",
                "description": "Pelo cabeçalho X-AX-Clinica (código) ou pelo anfitrião do pedido (domínios verificados); recurso à clínica pública do servidor.",
                "parameters": [
                    {
                        "name": "X-AX-Clinica",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "example": "PORTO-HAIR"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ClinicaPublica"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/publico/clinica/{codigo}": {
            "get": {
                "tags": [
                    "Clínica pública"
                ],
                "operationId": "clinicaPorCodigo",
                "security": [],
                "summary": "Clínica pelo código (escolha na app)",
                "description": "Só dados públicos. 30 pedidos por minuto por IP. disponivel = false quando a licença bloqueia a clínica.",
                "parameters": [
                    {
                        "name": "codigo",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^[A-Za-z][A-Za-z0-9-]{2,23}$"
                        },
                        "example": "PORTO-HAIR"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ClinicaPublica"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "codigo": "PORTO-HAIR",
                                        "nome": "Clínica Capilar Porto",
                                        "localidade": "Porto",
                                        "logotipo_url": null,
                                        "cor_marca": "#0E5B4F",
                                        "disponivel": true,
                                        "mensagem": null
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/publico/formularios/{token}": {
            "get": {
                "tags": [
                    "Formulários por ligação"
                ],
                "operationId": "m1FormularioPorLigacao",
                "security": [],
                "x-anagen-modulo": "publico",
                "x-anagen-nivel": "publico",
                "summary": "Formulário, esquema e pré-preenchimento",
                "description": "Sem autenticação. A clínica do anfitrião (ou do cabeçalho X-AX-Clinica) é resolvida primeiro, mas é o registo do pedido que define a clínica. Só pedidos «pendente» dentro do prazo (fora do prazo passa a «expirado»); caso contrário 404 «ligacao_invalida». Devolve o esquema da versão do pedido, os valores para pré-preencher (respostas anteriores do paciente ao mesmo formulário, sem fotografias nem assinaturas), o prazo, o pedido de informação quando a resposta foi devolvida e o nome da clínica. Acréscimos compatíveis: «consentimentos» (autorizações em falta, a mostrar como caixas nunca pré-assinaladas), «aviso» (aviso de privacidade em vigor do canal «formulario», com o testemunho a devolver no envio) e «armadilha» (nome do campo que tem de seguir vazio). Limite: 60 pedidos por 10 minutos por endereço IP, contando também as leituras (429 com Retry-After).",
                "parameters": [
                    {
                        "name": "token",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^[A-Za-z0-9_\\-]{30,60}$"
                        },
                        "example": "q3V9k1sXw7bE2mN4tR8yU0pL6aZ5cH1dF9gJ3kM2nB4",
                        "description": "Token da ligação (32 bytes aleatórios em base64url; só o SHA-256 fica guardado). Identifica o pedido, o paciente e a clínica."
                    },
                    {
                        "$ref": "#/components/parameters/XAxClinica"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1FormularioPublico"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "formulario": {
                                            "id": 31,
                                            "nome": "Questionário prévio — FUE",
                                            "descricao": "A preencher antes da primeira consulta.",
                                            "idioma": "pt-PT",
                                            "tipo": "questionario_previo"
                                        },
                                        "esquema": {
                                            "passos": [
                                                {
                                                    "chave": "p1",
                                                    "titulo": "Saúde geral",
                                                    "descricao": "",
                                                    "seccoes": [
                                                        {
                                                            "chave": "s1_1",
                                                            "titulo": "Antecedentes",
                                                            "descricao": "",
                                                            "perguntas": [
                                                                {
                                                                    "chave": "anticoagulantes",
                                                                    "tipo": "simnao",
                                                                    "rotulo": "Toma anticoagulantes?",
                                                                    "ajuda": "",
                                                                    "obrigatorio": true,
                                                                    "preencher": true,
                                                                    "pontos_sim": null,
                                                                    "alarme_sim": true,
                                                                    "alerta": {
                                                                        "tipo": "anticoagulante",
                                                                        "gravidade": "alta",
                                                                        "quando": [
                                                                            "sim"
                                                                        ]
                                                                    }
                                                                },
                                                                {
                                                                    "chave": "qual_anticoagulante",
                                                                    "tipo": "texto",
                                                                    "rotulo": "Qual?",
                                                                    "ajuda": "",
                                                                    "obrigatorio": false,
                                                                    "preencher": true,
                                                                    "max": 200,
                                                                    "condicao": {
                                                                        "pergunta": "anticoagulantes",
                                                                        "operador": "=",
                                                                        "valor": "sim"
                                                                    }
                                                                },
                                                                {
                                                                    "chave": "impacto",
                                                                    "tipo": "escala",
                                                                    "rotulo": "Quanto o incomoda a queda de cabelo?",
                                                                    "ajuda": "",
                                                                    "obrigatorio": true,
                                                                    "preencher": false,
                                                                    "min": 0,
                                                                    "max": 10,
                                                                    "passo": 1,
                                                                    "rotulo_min": "Nada",
                                                                    "rotulo_max": "Muito",
                                                                    "pontuar": true,
                                                                    "alarme_min": null
                                                                }
                                                            ]
                                                        }
                                                    ]
                                                }
                                            ],
                                            "pontuacao": {
                                                "ativa": true,
                                                "rotulo": "Impacto",
                                                "modo": "soma",
                                                "pergunta": null,
                                                "faixas": [
                                                    {
                                                        "min": 0,
                                                        "max": 4,
                                                        "rotulo": "Baixo",
                                                        "tom": "sucesso"
                                                    },
                                                    {
                                                        "min": 5,
                                                        "max": 10,
                                                        "rotulo": "Elevado",
                                                        "tom": "aviso"
                                                    }
                                                ]
                                            },
                                            "alarmes": {
                                                "departamento": "enfermagem"
                                            }
                                        },
                                        "valores": [],
                                        "consentimentos": [
                                            {
                                                "finalidade": "tratamento_clinico",
                                                "texto": "Autorizo a clínica a tratar os dados de saúde deste questionário para a minha avaliação e acompanhamento clínico.",
                                                "modelo_id": 12
                                            }
                                        ],
                                        "aviso": {
                                            "id": 4,
                                            "canal": "formulario",
                                            "canal_rotulo": "Formulários",
                                            "versao": 2,
                                            "titulo": "Como tratamos os seus dados",
                                            "texto": "<p>…</p>",
                                            "idioma": "pt-PT",
                                            "publicado_em": "2026-10-20T10:00:00+00:00",
                                            "resumo": null,
                                            "contexto": "formulario",
                                            "testemunho": "eyJhIjo0LCJ2IjoyfQ.…"
                                        },
                                        "expira_em": "2026-11-12T09:40:00+00:00",
                                        "devolucao_motivo": null,
                                        "clinica": "Clínica Exemplo Porto",
                                        "armadilha": "honeypot"
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ligação inexistente, expirada ou já respondida (ligacao_invalida)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M1RespostaErro"
                                },
                                "example": {
                                    "ok": false,
                                    "erro": {
                                        "codigo": "ligacao_invalida",
                                        "mensagem": "Esta ligação já não é válida."
                                    }
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            },
            "post": {
                "tags": [
                    "Formulários por ligação"
                ],
                "operationId": "m1ResponderPorLigacao",
                "security": [],
                "x-anagen-modulo": "publico",
                "x-anagen-nivel": "publico",
                "summary": "Enviar as respostas",
                "description": "Sem autenticação (Idempotency-Key não se aplica). Respostas validadas contra o esquema da versão do pedido (mesmas regras de POST /formularios/{id}/respostas; erros → 422 com a chave da pergunta). Nas perguntas de fotografia só valem os ficheiros carregados para este pedido. A resposta fica sempre «por_validar» (origem «paciente») e o token deixa de valer. Ao paciente só se confirma a receção — nunca a pontuação nem os alarmes. Efeitos: respostas cifradas, alertas por validar, alarme → tarefa urgente e aviso ao departamento, pré-avaliação → tarefa de revisão médica, linha do tempo, auditoria, webhook formulario.respondido. Consentimento obrigatório antes de gravar: «tratamento_clinico» (e «fotografias_clinicas» quando há fotografias) já registado ou declarado em «consentimentos»; sem ele 422 com o erro por campo «consentimentos.<finalidade>» e nada é gravado (as respostas continuam no ecrã). As declarações ficam registadas de forma imutável (canal «formulario_site»). Com «aviso_testemunho», fica registada a versão do aviso de privacidade mostrada. Campo armadilha preenchido → 201 com resposta_id nulo e nada gravado. Limite: 10 pedidos por 10 minutos por endereço IP (429 com Retry-After).",
                "parameters": [
                    {
                        "name": "token",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^[A-Za-z0-9_\\-]{30,60}$"
                        },
                        "example": "q3V9k1sXw7bE2mN4tR8yU0pL6aZ5cH1dF9gJ3kM2nB4",
                        "description": "Token da ligação (32 bytes aleatórios em base64url; só o SHA-256 fica guardado). Identifica o pedido, o paciente e a clínica."
                    },
                    {
                        "$ref": "#/components/parameters/XAxClinica"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "respostas": {
                                        "type": "object",
                                        "additionalProperties": true,
                                        "description": "Chave da pergunta → valor."
                                    },
                                    "idioma": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "enum": [
                                            "pt-PT",
                                            "pt-BR",
                                            "en",
                                            "es",
                                            "fr",
                                            "de",
                                            null
                                        ]
                                    },
                                    "consentimentos": {
                                        "type": "object",
                                        "additionalProperties": {
                                            "type": "boolean"
                                        },
                                        "description": "Consentimentos declarados: {finalidade: true}."
                                    },
                                    "aviso_testemunho": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "description": "Testemunho do aviso mostrado (de «aviso» no GET)."
                                    }
                                },
                                "required": [
                                    "respostas"
                                ]
                            },
                            "example": {
                                "respostas": {
                                    "anticoagulantes": "sim",
                                    "qual_anticoagulante": "Apixabano 5 mg",
                                    "impacto": 7
                                },
                                "idioma": "pt-PT",
                                "consentimentos": {
                                    "tratamento_clinico": true
                                },
                                "aviso_testemunho": "eyJhIjo0LCJ2IjoyfQ.…",
                                "honeypot": ""
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "recebido": {
                                                    "const": true
                                                },
                                                "resposta_id": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "recebido": true,
                                        "resposta_id": 5130
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ligação inexistente, expirada ou já respondida (ligacao_invalida)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M1RespostaErro"
                                },
                                "example": {
                                    "ok": false,
                                    "erro": {
                                        "codigo": "ligacao_invalida",
                                        "mensagem": "Esta ligação já não é válida."
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/publico/formularios/{token}/ficheiros": {
            "post": {
                "tags": [
                    "Formulários por ligação"
                ],
                "operationId": "m1FicheiroPorLigacao",
                "security": [],
                "x-anagen-modulo": "publico",
                "x-anagen-nivel": "publico",
                "summary": "Carregar a fotografia de uma pergunta",
                "description": "Sem autenticação. Só imagens, até 15 MB: tipo real verificado pelos bytes, extensões executáveis recusadas, nome aleatório, guardada fora da área pública como ficheiro clínico do paciente e ligada a este pedido. Nenhuma fotografia é recolhida antes da autorização «fotografias_clinicas» (já registada ou declarada em consentimento_fotos = 1; senão 422 em «ficheiro»), como na página web. Devolve o identificador a usar na resposta da pergunta de fotografia. Ficheiro em falta ou inválido → 422. Limite: 30 pedidos por 10 minutos por endereço IP (429 com Retry-After).",
                "parameters": [
                    {
                        "name": "token",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^[A-Za-z0-9_\\-]{30,60}$"
                        },
                        "example": "q3V9k1sXw7bE2mN4tR8yU0pL6aZ5cH1dF9gJ3kM2nB4",
                        "description": "Token da ligação (32 bytes aleatórios em base64url; só o SHA-256 fica guardado). Identifica o pedido, o paciente e a clínica."
                    },
                    {
                        "$ref": "#/components/parameters/XAxClinica"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ficheiro"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary",
                                        "description": "Imagem até 15 MB"
                                    },
                                    "consentimento_fotos": {
                                        "type": "string",
                                        "enum": [
                                            "0",
                                            "1"
                                        ],
                                        "description": "1 quando a autorização para as fotografias foi assinalada no formulário."
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "nome": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 9050,
                                        "nome": "topo.jpg"
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Ligação inexistente, expirada ou já respondida (ligacao_invalida)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M1RespostaErro"
                                },
                                "example": {
                                    "ok": false,
                                    "erro": {
                                        "codigo": "ligacao_invalida",
                                        "mensagem": "Esta ligação já não é válida."
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/publico/pre-avaliacao": {
            "get": {
                "summary": "Formulário de pré-avaliação da clínica",
                "description": "Sem sessão. Perguntas (do formulário clínico da clínica quando existe, senão as perguntas base), vistas das fotografias, consentimentos (sempre desmarcados), limites, textos e selo. Limite: 60 por minuto e por IP.",
                "parameters": [
                    {
                        "name": "lingua",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "pt",
                                "pt_BR",
                                "en",
                                "es",
                                "fr",
                                "de"
                            ]
                        }
                    },
                    {
                        "name": "X-AX-Clinica",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Identificador público da clínica (domínio ou código). Sem ele, a clínica é resolvida pelo domínio do pedido."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PreAvaliacaoEsquema"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ativo": true,
                                        "idioma": "pt",
                                        "titulo": "Pré-avaliação online",
                                        "passos": [
                                            {
                                                "chave": "privacidade",
                                                "titulo": "Antes de começar"
                                            }
                                        ],
                                        "perguntas": [
                                            {
                                                "chave": "idade",
                                                "passo": "sobre",
                                                "tipo": "numero",
                                                "obrigatorio": true,
                                                "rotulo": "Idade",
                                                "ajuda": "Em anos.",
                                                "opcoes": [],
                                                "min": 16,
                                                "max": 99
                                            }
                                        ],
                                        "vistas": [
                                            {
                                                "chave": "frontal",
                                                "titulo": "Frente",
                                                "instrucoes": "Olhe em frente, cabelo puxado para trás.",
                                                "obrigatoria": true
                                            }
                                        ],
                                        "consentimentos": [
                                            {
                                                "finalidade": "tratamento_clinico",
                                                "texto": "Autorizo o tratamento dos meus dados de saúde…",
                                                "obrigatorio": true,
                                                "valor": false
                                            }
                                        ],
                                        "limites": {
                                            "fotos_min": 3,
                                            "fotos_max": 5,
                                            "max_mb": 12
                                        },
                                        "selo": "MTczMDEwOTYwMC5…",
                                        "armadilha": "website_url"
                                    }
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Pré-avaliação online"
                ],
                "operationId": "preAvaliacaoEsquema",
                "security": [],
                "x-anagen-modulo": "publico",
                "x-anagen-nivel": "publico"
            },
            "post": {
                "summary": "Enviar a pré-avaliação",
                "description": "Sem sessão. Os consentimentos obrigatórios são verificados antes de gravar qualquer dado. As respostas são validadas pela lista de perguntas do esquema; as fotografias são os testemunhos devolvidos por POST /publico/pre-avaliacao/fotos (válidos 24 h, da mesma clínica). Efeitos: lead (origem pré-avaliação), consentimentos registados, respostas cifradas, fotografias ligadas, tarefa de revisão médica, linha do tempo, email de confirmação sem conteúdo clínico e webhook «pre_avaliacao.recebida». A resposta nunca revela a triagem clínica: «triagem» é apenas «revisao» ou «consulta». Limite: 5 por 10 minutos por IP.",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    },
                    {
                        "name": "X-AX-Clinica",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Identificador público da clínica (domínio ou código). Sem ele, a clínica é resolvida pelo domínio do pedido."
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "lingua": {
                                        "type": "string",
                                        "enum": [
                                            "pt",
                                            "pt_BR",
                                            "en",
                                            "es",
                                            "fr",
                                            "de"
                                        ]
                                    },
                                    "respostas": {
                                        "type": "object",
                                        "description": "Chave da pergunta → valor (string, número, booleano ou lista nas multiEscolha).",
                                        "additionalProperties": true
                                    },
                                    "consentimentos": {
                                        "type": "object",
                                        "description": "Finalidade → true/false.",
                                        "additionalProperties": {
                                            "type": "boolean"
                                        }
                                    },
                                    "fotos": {
                                        "type": "array",
                                        "items": {
                                            "type": "string",
                                            "description": "Testemunho de uma fotografia."
                                        }
                                    },
                                    "consulta": {
                                        "type": "object",
                                        "description": "Obrigatória quando consulta.ativa: modalidade presencial | telefone | video; data (AAAA-MM-DD) e periodo (manha | tarde | fim_dia) opcionais. Gera o pedido de marcação com o tipo da agenda correspondente.",
                                        "properties": {
                                            "modalidade": {
                                                "type": "string",
                                                "enum": [
                                                    "presencial",
                                                    "telefone",
                                                    "video"
                                                ]
                                            },
                                            "data": {
                                                "type": "string",
                                                "format": "date"
                                            },
                                            "periodo": {
                                                "type": "string",
                                                "enum": [
                                                    "manha",
                                                    "tarde",
                                                    "fim_dia"
                                                ]
                                            }
                                        }
                                    },
                                    "aviso_testemunho": {
                                        "type": "string",
                                        "description": "Testemunho de aviso.testemunho do esquema: regista a versão do aviso de privacidade mostrada."
                                    },
                                    "utm_source": {
                                        "type": "string"
                                    },
                                    "utm_medium": {
                                        "type": "string"
                                    },
                                    "utm_campaign": {
                                        "type": "string"
                                    },
                                    "_selo": {
                                        "type": "string"
                                    },
                                    "website_url": {
                                        "type": "string",
                                        "maxLength": 0
                                    }
                                },
                                "required": [
                                    "respostas",
                                    "consentimentos",
                                    "fotos",
                                    "_selo"
                                ]
                            },
                            "example": {
                                "lingua": "pt",
                                "respostas": {
                                    "nome": "João Costa",
                                    "email": "joao.costa@exemplo.pt",
                                    "telefone": "+351 913 222 111",
                                    "pais": "PT",
                                    "idade": 34,
                                    "area": "couro_cabeludo",
                                    "tempo_queda": "3_5",
                                    "cirurgia_anterior": "nao",
                                    "tratamentos": [
                                        "minoxidil"
                                    ]
                                },
                                "consentimentos": {
                                    "tratamento_clinico": true,
                                    "fotografias_clinicas": true,
                                    "contacto": true,
                                    "marketing": false
                                },
                                "fotos": [
                                    "ODgwMS5mcm9udGFsLjE3MzAy…",
                                    "ODgwMi50b3BvLjE3MzAy…",
                                    "ODgwMy5kYWRvcmEuMTczMDI…"
                                ],
                                "_selo": "MTczMDEwOTYwMC5…",
                                "website_url": ""
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                },
                                                "titulo": {
                                                    "type": "string"
                                                },
                                                "mensagem": {
                                                    "type": "string"
                                                },
                                                "triagem": {
                                                    "type": "string",
                                                    "enum": [
                                                        "revisao",
                                                        "consulta"
                                                    ]
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 91,
                                        "titulo": "Recebemos a sua pré-avaliação",
                                        "mensagem": "Um médico vai rever o seu caso e respondemos por email.",
                                        "triagem": "revisao"
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Pré-avaliação online"
                ],
                "operationId": "preAvaliacaoEnviar",
                "security": [],
                "x-anagen-modulo": "publico",
                "x-anagen-nivel": "publico"
            }
        },
        "/publico/pre-avaliacao/fotos": {
            "post": {
                "summary": "Enviar uma fotografia da pré-avaliação",
                "description": "Sem sessão, multipart. Só é aceite com consentimento_fotos = 1. O tipo real é verificado pelos bytes; o ficheiro é cifrado com a chave clínica e guardado fora da área pública com nome aleatório. Devolve um testemunho assinado (24 h) a incluir em «fotos» no envio. Fotografias não usadas são apagadas automaticamente. Limite: 40 por hora por IP.",
                "parameters": [
                    {
                        "name": "X-AX-Clinica",
                        "in": "header",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Identificador público da clínica (domínio ou código). Sem ele, a clínica é resolvida pelo domínio do pedido."
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ficheiro",
                                    "vista",
                                    "consentimento_fotos"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary",
                                        "description": "JPEG, PNG, WebP ou HEIC até ao limite (limites.max_mb)."
                                    },
                                    "vista": {
                                        "type": "string",
                                        "enum": [
                                            "frontal",
                                            "topo",
                                            "coroa",
                                            "lateral",
                                            "dadora"
                                        ]
                                    },
                                    "consentimento_fotos": {
                                        "const": "1"
                                    },
                                    "lingua": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "token": {
                                                    "type": "string"
                                                },
                                                "vista": {
                                                    "type": "string"
                                                },
                                                "largura": {
                                                    "type": "integer"
                                                },
                                                "altura": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "token": "ODgwMS5mcm9udGFsLjE3MzAy…",
                                        "vista": "frontal",
                                        "largura": 3024,
                                        "altura": 4032
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Pré-avaliação online"
                ],
                "operationId": "preAvaliacaoFoto",
                "security": [],
                "x-anagen-modulo": "publico",
                "x-anagen-nivel": "publico"
            }
        },
        "/r/academia_certificados": {
            "get": {
                "tags": [
                    "Recurso: Certificados"
                ],
                "operationId": "listarAcademiaCertificados",
                "summary": "Listar Certificados",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[utilizador_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Pessoa». Lista: a,b; intervalo: f[utilizador_id][de]= e f[utilizador_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[curso_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Curso». Lista: a,b; intervalo: f[curso_id][de]= e f[curso_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[emitido_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Emitido em». Lista: a,b; intervalo: f[emitido_em][de]= e f[emitido_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_academia_certificados"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "academia_certificados"
            }
        },
        "/r/academia_certificados/esquema": {
            "get": {
                "tags": [
                    "Recurso: Certificados"
                ],
                "operationId": "esquemaAcademiaCertificados",
                "summary": "Esquema de «Certificados» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "academia_certificados"
            }
        },
        "/r/academia_certificados/{id}": {
            "get": {
                "tags": [
                    "Recurso: Certificados"
                ],
                "operationId": "obterAcademiaCertificados",
                "summary": "Obter Certificado",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_academia_certificados"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "academia_certificados"
            }
        },
        "/r/academia_certificados/{id}/acao/revogar": {
            "post": {
                "tags": [
                    "Recurso: Certificados"
                ],
                "operationId": "acaoRevogarAcademiaCertificados",
                "summary": "Ação: Revogar",
                "description": "Nível exigido: editar. Revogar este certificado? A pessoa deixa de o ver como válido.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Motivo",
                                        "maxLength": 255
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "academia_certificados"
            }
        },
        "/r/academia_cursos": {
            "get": {
                "tags": [
                    "Recurso: Cursos da academia"
                ],
                "operationId": "listarAcademiaCursos",
                "summary": "Listar Cursos da academia",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[categoria]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Categoria». Lista: a,b; intervalo: f[categoria][de]= e f[categoria][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_academia_cursos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "academia_cursos"
            },
            "post": {
                "tags": [
                    "Recurso: Cursos da academia"
                ],
                "operationId": "criarAcademiaCursos",
                "summary": "Criar Curso",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_academia_cursos_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_academia_cursos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_academia_cursos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "academia_cursos"
            }
        },
        "/r/academia_cursos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Cursos da academia"
                ],
                "operationId": "esquemaAcademiaCursos",
                "summary": "Esquema de «Cursos da academia» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "academia_cursos"
            }
        },
        "/r/academia_cursos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Cursos da academia"
                ],
                "operationId": "obterAcademiaCursos",
                "summary": "Obter Curso",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_academia_cursos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "academia_cursos"
            },
            "put": {
                "tags": [
                    "Recurso: Cursos da academia"
                ],
                "operationId": "alterarAcademiaCursos",
                "summary": "Alterar Curso",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_academia_cursos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_academia_cursos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "academia_cursos"
            },
            "delete": {
                "tags": [
                    "Recurso: Cursos da academia"
                ],
                "operationId": "apagarAcademiaCursos",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "academia_cursos"
            }
        },
        "/r/academia_licoes": {
            "get": {
                "tags": [
                    "Recurso: Lições"
                ],
                "operationId": "listarAcademiaLicoes",
                "summary": "Listar Lições",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[curso_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Curso». Lista: a,b; intervalo: f[curso_id][de]= e f[curso_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_academia_licoes"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "academia_licoes"
            },
            "post": {
                "tags": [
                    "Recurso: Lições"
                ],
                "operationId": "criarAcademiaLicoes",
                "summary": "Criar Lição",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_academia_licoes_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_academia_licoes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_academia_licoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "academia_licoes"
            }
        },
        "/r/academia_licoes/esquema": {
            "get": {
                "tags": [
                    "Recurso: Lições"
                ],
                "operationId": "esquemaAcademiaLicoes",
                "summary": "Esquema de «Lições» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "academia_licoes"
            }
        },
        "/r/academia_licoes/{id}": {
            "get": {
                "tags": [
                    "Recurso: Lições"
                ],
                "operationId": "obterAcademiaLicoes",
                "summary": "Obter Lição",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_academia_licoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "academia_licoes"
            },
            "put": {
                "tags": [
                    "Recurso: Lições"
                ],
                "operationId": "alterarAcademiaLicoes",
                "summary": "Alterar Lição",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_academia_licoes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_academia_licoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "academia_licoes"
            },
            "delete": {
                "tags": [
                    "Recurso: Lições"
                ],
                "operationId": "apagarAcademiaLicoes",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "academia_licoes"
            }
        },
        "/r/academia_percursos": {
            "get": {
                "tags": [
                    "Recurso: Percursos de formação"
                ],
                "operationId": "listarAcademiaPercursos",
                "summary": "Listar Percursos de formação",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativo». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_academia_percursos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "academia_percursos"
            },
            "post": {
                "tags": [
                    "Recurso: Percursos de formação"
                ],
                "operationId": "criarAcademiaPercursos",
                "summary": "Criar Percurso",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_academia_percursos_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_academia_percursos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_academia_percursos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "academia_percursos"
            }
        },
        "/r/academia_percursos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Percursos de formação"
                ],
                "operationId": "esquemaAcademiaPercursos",
                "summary": "Esquema de «Percursos de formação» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "academia_percursos"
            }
        },
        "/r/academia_percursos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Percursos de formação"
                ],
                "operationId": "obterAcademiaPercursos",
                "summary": "Obter Percurso",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_academia_percursos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "academia_percursos"
            },
            "put": {
                "tags": [
                    "Recurso: Percursos de formação"
                ],
                "operationId": "alterarAcademiaPercursos",
                "summary": "Alterar Percurso",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_academia_percursos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_academia_percursos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "academia_percursos"
            },
            "delete": {
                "tags": [
                    "Recurso: Percursos de formação"
                ],
                "operationId": "apagarAcademiaPercursos",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "academia_percursos"
            }
        },
        "/r/academia_perguntas": {
            "get": {
                "tags": [
                    "Recurso: Perguntas dos testes"
                ],
                "operationId": "listarAcademiaPerguntas",
                "summary": "Listar Perguntas dos testes",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[curso_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Curso». Lista: a,b; intervalo: f[curso_id][de]= e f[curso_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_academia_perguntas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "academia_perguntas"
            },
            "post": {
                "tags": [
                    "Recurso: Perguntas dos testes"
                ],
                "operationId": "criarAcademiaPerguntas",
                "summary": "Criar Pergunta",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_academia_perguntas_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_academia_perguntas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_academia_perguntas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "academia_perguntas"
            }
        },
        "/r/academia_perguntas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Perguntas dos testes"
                ],
                "operationId": "esquemaAcademiaPerguntas",
                "summary": "Esquema de «Perguntas dos testes» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "academia_perguntas"
            }
        },
        "/r/academia_perguntas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Perguntas dos testes"
                ],
                "operationId": "obterAcademiaPerguntas",
                "summary": "Obter Pergunta",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_academia_perguntas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "academia_perguntas"
            },
            "put": {
                "tags": [
                    "Recurso: Perguntas dos testes"
                ],
                "operationId": "alterarAcademiaPerguntas",
                "summary": "Alterar Pergunta",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_academia_perguntas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_academia_perguntas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "academia_perguntas"
            },
            "delete": {
                "tags": [
                    "Recurso: Perguntas dos testes"
                ],
                "operationId": "apagarAcademiaPerguntas",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "academia_perguntas"
            }
        },
        "/r/acessos_emergencia": {
            "get": {
                "tags": [
                    "Recurso: Acessos de emergência"
                ],
                "operationId": "listarAcessosEmergencia",
                "summary": "Listar Acessos de emergência",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.auditoria:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[utilizador_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Pedido por». Lista: a,b; intervalo: f[utilizador_id][de]= e f[utilizador_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[decisao]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Decisão». Lista: a,b; intervalo: f[decisao][de]= e f[decisao][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_acessos_emergencia"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "acessos_emergencia"
            }
        },
        "/r/acessos_emergencia/esquema": {
            "get": {
                "tags": [
                    "Recurso: Acessos de emergência"
                ],
                "operationId": "esquemaAcessosEmergencia",
                "summary": "Esquema de «Acessos de emergência» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.auditoria:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "acessos_emergencia"
            }
        },
        "/r/acessos_emergencia/{id}": {
            "get": {
                "tags": [
                    "Recurso: Acessos de emergência"
                ],
                "operationId": "obterAcessosEmergencia",
                "summary": "Obter Acesso de emergência",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.auditoria:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_acessos_emergencia"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "acessos_emergencia"
            }
        },
        "/r/acessos_emergencia/{id}/acao/rever": {
            "post": {
                "tags": [
                    "Recurso: Acessos de emergência"
                ],
                "operationId": "acaoReverAcessosEmergencia",
                "summary": "Ação: Rever",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.auditoria:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "decisao": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Decisão",
                                        "enum": [
                                            "justificado",
                                            "injustificado"
                                        ],
                                        "x-enum-rotulos": {
                                            "justificado": "Justificado",
                                            "injustificado": "Injustificado"
                                        }
                                    },
                                    "notas": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Notas da revisão",
                                        "maxLength": 2000
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "acessos_emergencia"
            }
        },
        "/r/acessos_emergencia/{id}/acao/terminar": {
            "post": {
                "tags": [
                    "Recurso: Acessos de emergência"
                ],
                "operationId": "acaoTerminarAcessosEmergencia",
                "summary": "Ação: Terminar já",
                "description": "Nível exigido: editar. Terminar já este acesso de emergência?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.auditoria:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "acessos_emergencia"
            }
        },
        "/r/agente_pedidos": {
            "get": {
                "tags": [
                    "Recurso: Pedidos do agente"
                ],
                "operationId": "listarAgentePedidos",
                "summary": "Listar Pedidos do agente",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[canal]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Canal». Lista: a,b; intervalo: f[canal][de]= e f[canal][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[sinal_alarme]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Sinal de alarme». Lista: a,b; intervalo: f[sinal_alarme][de]= e f[sinal_alarme][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[amostra]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Amostra para revisão». Lista: a,b; intervalo: f[amostra][de]= e f[amostra][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[revisao_estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Revisão». Lista: a,b; intervalo: f[revisao_estado][de]= e f[revisao_estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[criado_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Data». Lista: a,b; intervalo: f[criado_em][de]= e f[criado_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_agente_pedidos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "agente_pedidos"
            }
        },
        "/r/agente_pedidos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Pedidos do agente"
                ],
                "operationId": "esquemaAgentePedidos",
                "summary": "Esquema de «Pedidos do agente» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "agente_pedidos"
            }
        },
        "/r/agente_pedidos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Pedidos do agente"
                ],
                "operationId": "obterAgentePedidos",
                "summary": "Obter Pedido do agente",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_agente_pedidos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "agente_pedidos"
            }
        },
        "/r/agente_pedidos/{id}/acao/teste": {
            "post": {
                "tags": [
                    "Recurso: Pedidos do agente"
                ],
                "operationId": "acaoTesteAgentePedidos",
                "summary": "Ação: Criar conversa de teste",
                "description": "Nível exigido: editar. Criar uma conversa de teste a partir desta conversa (sem dados pessoais)?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "agente_pedidos"
            }
        },
        "/r/agente_testes": {
            "get": {
                "tags": [
                    "Recurso: Conversas de teste"
                ],
                "operationId": "listarAgenteTestes",
                "summary": "Listar Conversas de teste",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[canal]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Canal». Lista: a,b; intervalo: f[canal][de]= e f[canal][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativa». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_agente_testes"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "agente_testes"
            },
            "post": {
                "tags": [
                    "Recurso: Conversas de teste"
                ],
                "operationId": "criarAgenteTestes",
                "summary": "Criar Conversa de teste",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_agente_testes_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_agente_testes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_agente_testes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "agente_testes"
            }
        },
        "/r/agente_testes/esquema": {
            "get": {
                "tags": [
                    "Recurso: Conversas de teste"
                ],
                "operationId": "esquemaAgenteTestes",
                "summary": "Esquema de «Conversas de teste» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "agente_testes"
            }
        },
        "/r/agente_testes/{id}": {
            "get": {
                "tags": [
                    "Recurso: Conversas de teste"
                ],
                "operationId": "obterAgenteTestes",
                "summary": "Obter Conversa de teste",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_agente_testes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "agente_testes"
            },
            "put": {
                "tags": [
                    "Recurso: Conversas de teste"
                ],
                "operationId": "alterarAgenteTestes",
                "summary": "Alterar Conversa de teste",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_agente_testes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_agente_testes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "agente_testes"
            },
            "delete": {
                "tags": [
                    "Recurso: Conversas de teste"
                ],
                "operationId": "apagarAgenteTestes",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "agente_testes"
            }
        },
        "/r/alertas_acesso": {
            "get": {
                "tags": [
                    "Recurso: Alertas de acesso"
                ],
                "operationId": "listarAlertasAcesso",
                "summary": "Listar Alertas de acesso",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.auditoria:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[utilizador_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Pessoa». Lista: a,b; intervalo: f[utilizador_id][de]= e f[utilizador_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[gravidade]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Gravidade». Lista: a,b; intervalo: f[gravidade][de]= e f[gravidade][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[detetado_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Detetado em». Lista: a,b; intervalo: f[detetado_em][de]= e f[detetado_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[decisao]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Decisão». Lista: a,b; intervalo: f[decisao][de]= e f[decisao][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_alertas_acesso"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "alertas_acesso"
            }
        },
        "/r/alertas_acesso/esquema": {
            "get": {
                "tags": [
                    "Recurso: Alertas de acesso"
                ],
                "operationId": "esquemaAlertasAcesso",
                "summary": "Esquema de «Alertas de acesso» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.auditoria:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "alertas_acesso"
            }
        },
        "/r/alertas_acesso/{id}": {
            "get": {
                "tags": [
                    "Recurso: Alertas de acesso"
                ],
                "operationId": "obterAlertasAcesso",
                "summary": "Obter Alerta de acesso",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.auditoria:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_alertas_acesso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "alertas_acesso"
            }
        },
        "/r/alertas_acesso/{id}/acao/detetar_agora": {
            "post": {
                "tags": [
                    "Recurso: Alertas de acesso"
                ],
                "operationId": "acaoDetetarAgoraAlertasAcesso",
                "summary": "Ação: Detetar agora",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.auditoria:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "alertas_acesso"
            }
        },
        "/r/alertas_acesso/{id}/acao/rever": {
            "post": {
                "tags": [
                    "Recurso: Alertas de acesso"
                ],
                "operationId": "acaoReverAlertasAcesso",
                "summary": "Ação: Rever",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.auditoria:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "decisao": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Decisão",
                                        "enum": [
                                            "justificado",
                                            "injustificado",
                                            "falso_positivo"
                                        ],
                                        "x-enum-rotulos": {
                                            "justificado": "Justificado",
                                            "injustificado": "Injustificado",
                                            "falso_positivo": "Falso positivo"
                                        }
                                    },
                                    "notas": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Notas",
                                        "maxLength": 5000
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "alertas_acesso"
            }
        },
        "/r/api_clientes": {
            "get": {
                "tags": [
                    "Recurso: Clientes de integração"
                ],
                "operationId": "listarApiClientes",
                "summary": "Listar Clientes de integração",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativo». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_api_clientes"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "api_clientes"
            },
            "post": {
                "tags": [
                    "Recurso: Clientes de integração"
                ],
                "operationId": "criarApiClientes",
                "summary": "Criar Cliente de integração",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_api_clientes_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_api_clientes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_api_clientes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "api_clientes"
            }
        },
        "/r/api_clientes/esquema": {
            "get": {
                "tags": [
                    "Recurso: Clientes de integração"
                ],
                "operationId": "esquemaApiClientes",
                "summary": "Esquema de «Clientes de integração» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "api_clientes"
            }
        },
        "/r/api_clientes/{id}": {
            "get": {
                "tags": [
                    "Recurso: Clientes de integração"
                ],
                "operationId": "obterApiClientes",
                "summary": "Obter Cliente de integração",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_api_clientes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "api_clientes"
            },
            "put": {
                "tags": [
                    "Recurso: Clientes de integração"
                ],
                "operationId": "alterarApiClientes",
                "summary": "Alterar Cliente de integração",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_api_clientes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_api_clientes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "api_clientes"
            },
            "delete": {
                "tags": [
                    "Recurso: Clientes de integração"
                ],
                "operationId": "apagarApiClientes",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "api_clientes"
            }
        },
        "/r/api_clientes/{id}/acao/aprovar_justificacao": {
            "post": {
                "tags": [
                    "Recurso: Clientes de integração"
                ],
                "operationId": "acaoAprovarJustificacaoApiClientes",
                "summary": "Ação: Aprovar justificação clínica",
                "description": "Nível exigido: ver. Aprovar a justificação clínica deste cliente?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "ver",
                "x-anagen-recurso": "api_clientes"
            }
        },
        "/r/api_clientes/{id}/acao/revogar": {
            "post": {
                "tags": [
                    "Recurso: Clientes de integração"
                ],
                "operationId": "acaoRevogarApiClientes",
                "summary": "Ação: Revogar",
                "description": "Nível exigido: editar. Revogar este cliente? Os tokens em uso terminam de imediato.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "api_clientes"
            }
        },
        "/r/api_clientes/{id}/acao/rodar_segredo": {
            "post": {
                "tags": [
                    "Recurso: Clientes de integração"
                ],
                "operationId": "acaoRodarSegredoApiClientes",
                "summary": "Ação: Rodar segredo",
                "description": "Nível exigido: editar. Gerar um segredo novo? O atual deixa de funcionar de imediato.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "api_clientes"
            }
        },
        "/r/artigos": {
            "get": {
                "tags": [
                    "Recurso: Artigos"
                ],
                "operationId": "listarArtigos",
                "summary": "Listar Artigos",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[categoria]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Categoria». Lista: a,b; intervalo: f[categoria][de]= e f[categoria][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[fornecedor]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Fornecedor habitual». Lista: a,b; intervalo: f[fornecedor][de]= e f[fornecedor][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativo». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_artigos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "artigos"
            },
            "post": {
                "tags": [
                    "Recurso: Artigos"
                ],
                "operationId": "criarArtigos",
                "summary": "Criar Artigo",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_artigos_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_artigos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_artigos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "artigos"
            }
        },
        "/r/artigos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Artigos"
                ],
                "operationId": "esquemaArtigos",
                "summary": "Esquema de «Artigos» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "artigos"
            }
        },
        "/r/artigos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Artigos"
                ],
                "operationId": "obterArtigos",
                "summary": "Obter Artigo",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_artigos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "artigos"
            },
            "put": {
                "tags": [
                    "Recurso: Artigos"
                ],
                "operationId": "alterarArtigos",
                "summary": "Alterar Artigo",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_artigos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_artigos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "artigos"
            },
            "delete": {
                "tags": [
                    "Recurso: Artigos"
                ],
                "operationId": "apagarArtigos",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "artigos"
            }
        },
        "/r/artigos/{id}/acao/movimento": {
            "post": {
                "tags": [
                    "Recurso: Artigos"
                ],
                "operationId": "acaoMovimentoArtigos",
                "summary": "Ação: Registar movimento",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "tipo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Tipo",
                                        "enum": [
                                            "entrada",
                                            "saida",
                                            "ajuste",
                                            "devolucao"
                                        ],
                                        "x-enum-rotulos": {
                                            "entrada": "Entrada",
                                            "saida": "Saída",
                                            "ajuste": "Ajuste",
                                            "devolucao": "Devolução"
                                        }
                                    },
                                    "quantidade": {
                                        "type": [
                                            "number",
                                            "null"
                                        ],
                                        "title": "Quantidade",
                                        "description": "Positiva para entradas; nos ajustes, negativa para retirar.",
                                        "x-casas": 3
                                    },
                                    "lote": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Lote",
                                        "maxLength": 60
                                    },
                                    "validade": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date",
                                        "title": "Validade"
                                    },
                                    "custo": {
                                        "type": [
                                            "number",
                                            "null"
                                        ],
                                        "title": "Custo unitário",
                                        "minimum": 0,
                                        "x-moeda": "EUR",
                                        "x-casas": 4
                                    },
                                    "notas": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Notas",
                                        "maxLength": 500
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "artigos"
            }
        },
        "/r/artigos_precos": {
            "get": {
                "tags": [
                    "Recurso: Preços de fornecedor"
                ],
                "operationId": "listarArtigosPrecos",
                "summary": "Listar Preços de fornecedor",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[artigo_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Artigo». Lista: a,b; intervalo: f[artigo_id][de]= e f[artigo_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[fornecedor]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Fornecedor». Lista: a,b; intervalo: f[fornecedor][de]= e f[fornecedor][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[preferido]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Preferido». Lista: a,b; intervalo: f[preferido][de]= e f[preferido][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_artigos_precos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "artigos_precos"
            },
            "post": {
                "tags": [
                    "Recurso: Preços de fornecedor"
                ],
                "operationId": "criarArtigosPrecos",
                "summary": "Criar Preço de fornecedor",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_artigos_precos_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_artigos_precos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_artigos_precos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "artigos_precos"
            }
        },
        "/r/artigos_precos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Preços de fornecedor"
                ],
                "operationId": "esquemaArtigosPrecos",
                "summary": "Esquema de «Preços de fornecedor» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "artigos_precos"
            }
        },
        "/r/artigos_precos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Preços de fornecedor"
                ],
                "operationId": "obterArtigosPrecos",
                "summary": "Obter Preço de fornecedor",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_artigos_precos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "artigos_precos"
            },
            "put": {
                "tags": [
                    "Recurso: Preços de fornecedor"
                ],
                "operationId": "alterarArtigosPrecos",
                "summary": "Alterar Preço de fornecedor",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_artigos_precos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_artigos_precos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "artigos_precos"
            },
            "delete": {
                "tags": [
                    "Recurso: Preços de fornecedor"
                ],
                "operationId": "apagarArtigosPrecos",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "artigos_precos"
            }
        },
        "/r/atividades_tratamento": {
            "get": {
                "tags": [
                    "Recurso: Registo das atividades de tratamento"
                ],
                "operationId": "listarAtividadesTratamento",
                "summary": "Listar Registo das atividades de tratamento",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[base_legal]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Fundamento jurídico». Lista: a,b; intervalo: f[base_legal][de]= e f[base_legal][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[aipd_estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Avaliação de impacto». Lista: a,b; intervalo: f[aipd_estado][de]= e f[aipd_estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[dispositivo_medico]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Software como dispositivo médico». Lista: a,b; intervalo: f[dispositivo_medico][de]= e f[dispositivo_medico][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativa]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativa». Lista: a,b; intervalo: f[ativa][de]= e f[ativa][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_atividades_tratamento"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "atividades_tratamento"
            },
            "post": {
                "tags": [
                    "Recurso: Registo das atividades de tratamento"
                ],
                "operationId": "criarAtividadesTratamento",
                "summary": "Criar Atividade de tratamento",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_atividades_tratamento_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_atividades_tratamento_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_atividades_tratamento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "atividades_tratamento"
            }
        },
        "/r/atividades_tratamento/esquema": {
            "get": {
                "tags": [
                    "Recurso: Registo das atividades de tratamento"
                ],
                "operationId": "esquemaAtividadesTratamento",
                "summary": "Esquema de «Registo das atividades de tratamento» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "atividades_tratamento"
            }
        },
        "/r/atividades_tratamento/{id}": {
            "get": {
                "tags": [
                    "Recurso: Registo das atividades de tratamento"
                ],
                "operationId": "obterAtividadesTratamento",
                "summary": "Obter Atividade de tratamento",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_atividades_tratamento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "atividades_tratamento"
            },
            "put": {
                "tags": [
                    "Recurso: Registo das atividades de tratamento"
                ],
                "operationId": "alterarAtividadesTratamento",
                "summary": "Alterar Atividade de tratamento",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_atividades_tratamento_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_atividades_tratamento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "atividades_tratamento"
            },
            "delete": {
                "tags": [
                    "Recurso: Registo das atividades de tratamento"
                ],
                "operationId": "apagarAtividadesTratamento",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "atividades_tratamento"
            }
        },
        "/r/atividades_tratamento/{id}/acao/marcar_revista": {
            "post": {
                "tags": [
                    "Recurso: Registo das atividades de tratamento"
                ],
                "operationId": "acaoMarcarRevistaAtividadesTratamento",
                "summary": "Ação: Marcar como revista",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "atividades_tratamento"
            }
        },
        "/r/ausencias": {
            "get": {
                "tags": [
                    "Recurso: Ausências e férias"
                ],
                "operationId": "listarAusencias",
                "summary": "Listar Ausências e férias",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[utilizador_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Pessoa». Lista: a,b; intervalo: f[utilizador_id][de]= e f[utilizador_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[recurso_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Sala ou equipamento». Lista: a,b; intervalo: f[recurso_id][de]= e f[recurso_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[inicio]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Início». Lista: a,b; intervalo: f[inicio][de]= e f[inicio][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[aprovada]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Aprovada». Lista: a,b; intervalo: f[aprovada][de]= e f[aprovada][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_ausencias"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "ausencias"
            },
            "post": {
                "tags": [
                    "Recurso: Ausências e férias"
                ],
                "operationId": "criarAusencias",
                "summary": "Criar Ausência",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_ausencias_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_ausencias_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_ausencias"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "ausencias"
            }
        },
        "/r/ausencias/esquema": {
            "get": {
                "tags": [
                    "Recurso: Ausências e férias"
                ],
                "operationId": "esquemaAusencias",
                "summary": "Esquema de «Ausências e férias» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "ausencias"
            }
        },
        "/r/ausencias/{id}": {
            "get": {
                "tags": [
                    "Recurso: Ausências e férias"
                ],
                "operationId": "obterAusencias",
                "summary": "Obter Ausência",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_ausencias"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "ausencias"
            },
            "put": {
                "tags": [
                    "Recurso: Ausências e férias"
                ],
                "operationId": "alterarAusencias",
                "summary": "Alterar Ausência",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_ausencias_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_ausencias"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "ausencias"
            },
            "delete": {
                "tags": [
                    "Recurso: Ausências e férias"
                ],
                "operationId": "apagarAusencias",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "ausencias"
            }
        },
        "/r/avisos_exibicoes": {
            "get": {
                "tags": [
                    "Recurso: Avisos mostrados"
                ],
                "operationId": "listarAvisosExibicoes",
                "summary": "Listar Avisos mostrados",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[mostrado_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Mostrado em». Lista: a,b; intervalo: f[mostrado_em][de]= e f[mostrado_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[canal]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Canal». Lista: a,b; intervalo: f[canal][de]= e f[canal][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[aviso_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Aviso». Lista: a,b; intervalo: f[aviso_id][de]= e f[aviso_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[contexto]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Onde». Lista: a,b; intervalo: f[contexto][de]= e f[contexto][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[meio]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Meio». Lista: a,b; intervalo: f[meio][de]= e f[meio][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[prova]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Prova». Lista: a,b; intervalo: f[prova][de]= e f[prova][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[titular_tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Titular». Lista: a,b; intervalo: f[titular_tipo][de]= e f[titular_tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[lead_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Contacto». Lista: a,b; intervalo: f[lead_id][de]= e f[lead_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_avisos_exibicoes"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "avisos_exibicoes"
            }
        },
        "/r/avisos_exibicoes/esquema": {
            "get": {
                "tags": [
                    "Recurso: Avisos mostrados"
                ],
                "operationId": "esquemaAvisosExibicoes",
                "summary": "Esquema de «Avisos mostrados» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "avisos_exibicoes"
            }
        },
        "/r/avisos_exibicoes/{id}": {
            "get": {
                "tags": [
                    "Recurso: Avisos mostrados"
                ],
                "operationId": "obterAvisosExibicoes",
                "summary": "Obter Aviso mostrado",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_avisos_exibicoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "avisos_exibicoes"
            }
        },
        "/r/avisos_privacidade": {
            "get": {
                "tags": [
                    "Recurso: Avisos de privacidade"
                ],
                "operationId": "listarAvisosPrivacidade",
                "summary": "Listar Avisos de privacidade",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[canal]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Canal». Lista: a,b; intervalo: f[canal][de]= e f[canal][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[idioma]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Língua». Lista: a,b; intervalo: f[idioma][de]= e f[idioma][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Em vigor». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_avisos_privacidade"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "avisos_privacidade"
            },
            "post": {
                "tags": [
                    "Recurso: Avisos de privacidade"
                ],
                "operationId": "criarAvisosPrivacidade",
                "summary": "Criar Aviso de privacidade",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_avisos_privacidade_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_avisos_privacidade_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_avisos_privacidade"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "avisos_privacidade"
            }
        },
        "/r/avisos_privacidade/esquema": {
            "get": {
                "tags": [
                    "Recurso: Avisos de privacidade"
                ],
                "operationId": "esquemaAvisosPrivacidade",
                "summary": "Esquema de «Avisos de privacidade» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "avisos_privacidade"
            }
        },
        "/r/avisos_privacidade/{id}": {
            "get": {
                "tags": [
                    "Recurso: Avisos de privacidade"
                ],
                "operationId": "obterAvisosPrivacidade",
                "summary": "Obter Aviso de privacidade",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_avisos_privacidade"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "avisos_privacidade"
            },
            "put": {
                "tags": [
                    "Recurso: Avisos de privacidade"
                ],
                "operationId": "alterarAvisosPrivacidade",
                "summary": "Alterar Aviso de privacidade",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_avisos_privacidade_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_avisos_privacidade"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "avisos_privacidade"
            },
            "delete": {
                "tags": [
                    "Recurso: Avisos de privacidade"
                ],
                "operationId": "apagarAvisosPrivacidade",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "avisos_privacidade"
            }
        },
        "/r/avisos_privacidade/{id}/acao/nova_versao": {
            "post": {
                "tags": [
                    "Recurso: Avisos de privacidade"
                ],
                "operationId": "acaoNovaVersaoAvisosPrivacidade",
                "summary": "Ação: Nova versão",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "avisos_privacidade"
            }
        },
        "/r/avisos_privacidade/{id}/acao/publicar": {
            "post": {
                "tags": [
                    "Recurso: Avisos de privacidade"
                ],
                "operationId": "acaoPublicarAvisosPrivacidade",
                "summary": "Ação: Publicar",
                "description": "Nível exigido: editar. Publicar este aviso? Substitui o aviso em vigor deste canal e língua e deixa de poder ser alterado.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "avisos_privacidade"
            }
        },
        "/r/base_conhecimento": {
            "get": {
                "tags": [
                    "Recurso: Base de conhecimento"
                ],
                "operationId": "listarBaseConhecimento",
                "summary": "Listar Base de conhecimento",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[categoria]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Categoria». Lista: a,b; intervalo: f[categoria][de]= e f[categoria][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[publico]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Para». Lista: a,b; intervalo: f[publico][de]= e f[publico][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[clinico]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Conteúdo clínico». Lista: a,b; intervalo: f[clinico][de]= e f[clinico][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[idioma]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Língua». Lista: a,b; intervalo: f[idioma][de]= e f[idioma][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_base_conhecimento"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "base_conhecimento"
            },
            "post": {
                "tags": [
                    "Recurso: Base de conhecimento"
                ],
                "operationId": "criarBaseConhecimento",
                "summary": "Criar Conteúdo",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_base_conhecimento_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_base_conhecimento_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_base_conhecimento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "base_conhecimento"
            }
        },
        "/r/base_conhecimento/esquema": {
            "get": {
                "tags": [
                    "Recurso: Base de conhecimento"
                ],
                "operationId": "esquemaBaseConhecimento",
                "summary": "Esquema de «Base de conhecimento» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "base_conhecimento"
            }
        },
        "/r/base_conhecimento/{id}": {
            "get": {
                "tags": [
                    "Recurso: Base de conhecimento"
                ],
                "operationId": "obterBaseConhecimento",
                "summary": "Obter Conteúdo",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_base_conhecimento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "base_conhecimento"
            },
            "put": {
                "tags": [
                    "Recurso: Base de conhecimento"
                ],
                "operationId": "alterarBaseConhecimento",
                "summary": "Alterar Conteúdo",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_base_conhecimento_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_base_conhecimento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "base_conhecimento"
            },
            "delete": {
                "tags": [
                    "Recurso: Base de conhecimento"
                ],
                "operationId": "apagarBaseConhecimento",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "base_conhecimento"
            }
        },
        "/r/base_conhecimento/{id}/acao/aprovar": {
            "post": {
                "tags": [
                    "Recurso: Base de conhecimento"
                ],
                "operationId": "acaoAprovarBaseConhecimento",
                "summary": "Ação: Aprovar",
                "description": "Nível exigido: editar. Aprovar este conteúdo? O agente passa a usá-lo nas respostas.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "base_conhecimento"
            }
        },
        "/r/base_conhecimento/{id}/acao/arquivar": {
            "post": {
                "tags": [
                    "Recurso: Base de conhecimento"
                ],
                "operationId": "acaoArquivarBaseConhecimento",
                "summary": "Ação: Arquivar",
                "description": "Nível exigido: editar. Arquivar este conteúdo? O agente deixa de o usar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.agente:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "base_conhecimento"
            }
        },
        "/r/caixas": {
            "get": {
                "tags": [
                    "Recurso: Caixas"
                ],
                "operationId": "listarCaixas",
                "summary": "Listar Caixas",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[data]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Data». Lista: a,b; intervalo: f[data][de]= e f[data][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[local_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Local». Lista: a,b; intervalo: f[local_id][de]= e f[local_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_caixas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "caixas"
            }
        },
        "/r/caixas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Caixas"
                ],
                "operationId": "esquemaCaixas",
                "summary": "Esquema de «Caixas» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "caixas"
            }
        },
        "/r/caixas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Caixas"
                ],
                "operationId": "obterCaixas",
                "summary": "Obter Caixa",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_caixas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "caixas"
            }
        },
        "/r/campanhas": {
            "get": {
                "tags": [
                    "Recurso: Campanhas"
                ],
                "operationId": "listarCampanhas",
                "summary": "Listar Campanhas",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[canal]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Canal». Lista: a,b; intervalo: f[canal][de]= e f[canal][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_campanhas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "campanhas"
            },
            "post": {
                "tags": [
                    "Recurso: Campanhas"
                ],
                "operationId": "criarCampanhas",
                "summary": "Criar Campanha",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_campanhas_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_campanhas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_campanhas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "campanhas"
            }
        },
        "/r/campanhas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Campanhas"
                ],
                "operationId": "esquemaCampanhas",
                "summary": "Esquema de «Campanhas» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "campanhas"
            }
        },
        "/r/campanhas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Campanhas"
                ],
                "operationId": "obterCampanhas",
                "summary": "Obter Campanha",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_campanhas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "campanhas"
            },
            "put": {
                "tags": [
                    "Recurso: Campanhas"
                ],
                "operationId": "alterarCampanhas",
                "summary": "Alterar Campanha",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_campanhas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_campanhas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "campanhas"
            },
            "delete": {
                "tags": [
                    "Recurso: Campanhas"
                ],
                "operationId": "apagarCampanhas",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "campanhas"
            }
        },
        "/r/campanhas_chamadas": {
            "get": {
                "tags": [
                    "Recurso: Listas de chamadas"
                ],
                "operationId": "listarCampanhasChamadas",
                "summary": "Listar Listas de chamadas",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[executor]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Quem liga». Lista: a,b; intervalo: f[executor][de]= e f[executor][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_campanhas_chamadas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "campanhas_chamadas"
            },
            "post": {
                "tags": [
                    "Recurso: Listas de chamadas"
                ],
                "operationId": "criarCampanhasChamadas",
                "summary": "Criar Lista de chamadas",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_campanhas_chamadas_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_campanhas_chamadas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_campanhas_chamadas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "campanhas_chamadas"
            }
        },
        "/r/campanhas_chamadas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Listas de chamadas"
                ],
                "operationId": "esquemaCampanhasChamadas",
                "summary": "Esquema de «Listas de chamadas» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "campanhas_chamadas"
            }
        },
        "/r/campanhas_chamadas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Listas de chamadas"
                ],
                "operationId": "obterCampanhasChamadas",
                "summary": "Obter Lista de chamadas",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_campanhas_chamadas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "campanhas_chamadas"
            },
            "put": {
                "tags": [
                    "Recurso: Listas de chamadas"
                ],
                "operationId": "alterarCampanhasChamadas",
                "summary": "Alterar Lista de chamadas",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_campanhas_chamadas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_campanhas_chamadas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "campanhas_chamadas"
            },
            "delete": {
                "tags": [
                    "Recurso: Listas de chamadas"
                ],
                "operationId": "apagarCampanhasChamadas",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "campanhas_chamadas"
            }
        },
        "/r/campanhas_chamadas/{id}/acao/ativar": {
            "post": {
                "tags": [
                    "Recurso: Listas de chamadas"
                ],
                "operationId": "acaoAtivarCampanhasChamadas",
                "summary": "Ação: Ativar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "campanhas_chamadas"
            }
        },
        "/r/campanhas_chamadas/{id}/acao/gerar": {
            "post": {
                "tags": [
                    "Recurso: Listas de chamadas"
                ],
                "operationId": "acaoGerarCampanhasChamadas",
                "summary": "Ação: Gerar contactos",
                "description": "Nível exigido: editar. Gerar os contactos pendentes a partir do filtro?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "campanhas_chamadas"
            }
        },
        "/r/campanhas_chamadas/{id}/acao/pausar": {
            "post": {
                "tags": [
                    "Recurso: Listas de chamadas"
                ],
                "operationId": "acaoPausarCampanhasChamadas",
                "summary": "Ação: Pausar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "campanhas_chamadas"
            }
        },
        "/r/capturas": {
            "get": {
                "tags": [
                    "Recurso: Capturas"
                ],
                "operationId": "listarCapturas",
                "summary": "Listar Capturas",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão. Cada leitura fica na auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[data]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Data». Lista: a,b; intervalo: f[data][de]= e f[data][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[qualidade_ok]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Qualidade suficiente». Lista: a,b; intervalo: f[qualidade_ok][de]= e f[qualidade_ok][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[repetir]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Repetir». Lista: a,b; intervalo: f[repetir][de]= e f[repetir][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_capturas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "capturas"
            },
            "post": {
                "tags": [
                    "Recurso: Capturas"
                ],
                "operationId": "criarCapturas",
                "summary": "Criar Captura",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_capturas_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_capturas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_capturas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "capturas"
            }
        },
        "/r/capturas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Capturas"
                ],
                "operationId": "esquemaCapturas",
                "summary": "Esquema de «Capturas» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "capturas"
            }
        },
        "/r/capturas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Capturas"
                ],
                "operationId": "obterCapturas",
                "summary": "Obter Captura",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_capturas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "capturas"
            },
            "put": {
                "tags": [
                    "Recurso: Capturas"
                ],
                "operationId": "alterarCapturas",
                "summary": "Alterar Captura",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_capturas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_capturas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "capturas"
            },
            "delete": {
                "tags": [
                    "Recurso: Capturas"
                ],
                "operationId": "apagarCapturas",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "capturas"
            }
        },
        "/r/capturas/{id}/acao/pedir_repeticao": {
            "post": {
                "tags": [
                    "Recurso: Capturas"
                ],
                "operationId": "acaoPedirRepeticaoCapturas",
                "summary": "Ação: Pedir repetição",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Motivo da repetição",
                                        "maxLength": 255
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "capturas"
            }
        },
        "/r/casos_publicados": {
            "get": {
                "tags": [
                    "Recurso: Casos publicados"
                ],
                "operationId": "listarCasosPublicados",
                "summary": "Listar Casos publicados",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "site.cms:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[idioma]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Língua». Lista: a,b; intervalo: f[idioma][de]= e f[idioma][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[publicado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Publicado». Lista: a,b; intervalo: f[publicado][de]= e f[publicado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_casos_publicados"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "casos_publicados"
            },
            "post": {
                "tags": [
                    "Recurso: Casos publicados"
                ],
                "operationId": "criarCasosPublicados",
                "summary": "Criar Caso",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "site.cms:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_casos_publicados_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_casos_publicados_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_casos_publicados"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "casos_publicados"
            }
        },
        "/r/casos_publicados/esquema": {
            "get": {
                "tags": [
                    "Recurso: Casos publicados"
                ],
                "operationId": "esquemaCasosPublicados",
                "summary": "Esquema de «Casos publicados» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "site.cms:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "casos_publicados"
            }
        },
        "/r/casos_publicados/{id}": {
            "get": {
                "tags": [
                    "Recurso: Casos publicados"
                ],
                "operationId": "obterCasosPublicados",
                "summary": "Obter Caso",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "site.cms:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_casos_publicados"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "casos_publicados"
            },
            "put": {
                "tags": [
                    "Recurso: Casos publicados"
                ],
                "operationId": "alterarCasosPublicados",
                "summary": "Alterar Caso",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "site.cms:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_casos_publicados_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_casos_publicados"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "casos_publicados"
            },
            "delete": {
                "tags": [
                    "Recurso: Casos publicados"
                ],
                "operationId": "apagarCasosPublicados",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "site.cms:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "casos_publicados"
            }
        },
        "/r/chamadas": {
            "get": {
                "tags": [
                    "Recurso: Chamadas"
                ],
                "operationId": "listarChamadas",
                "summary": "Listar Chamadas",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[direcao]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Sentido». Lista: a,b; intervalo: f[direcao][de]= e f[direcao][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[inicio]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Início». Lista: a,b; intervalo: f[inicio][de]= e f[inicio][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[utilizador_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Atendida por». Lista: a,b; intervalo: f[utilizador_id][de]= e f[utilizador_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[resultado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Resultado». Lista: a,b; intervalo: f[resultado][de]= e f[resultado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_chamadas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "chamadas"
            },
            "post": {
                "tags": [
                    "Recurso: Chamadas"
                ],
                "operationId": "criarChamadas",
                "summary": "Criar Chamada",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_chamadas_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_chamadas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_chamadas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "chamadas"
            }
        },
        "/r/chamadas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Chamadas"
                ],
                "operationId": "esquemaChamadas",
                "summary": "Esquema de «Chamadas» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "chamadas"
            }
        },
        "/r/chamadas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Chamadas"
                ],
                "operationId": "obterChamadas",
                "summary": "Obter Chamada",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_chamadas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "chamadas"
            },
            "put": {
                "tags": [
                    "Recurso: Chamadas"
                ],
                "operationId": "alterarChamadas",
                "summary": "Alterar Chamada",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_chamadas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_chamadas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "chamadas"
            }
        },
        "/r/checklist_modelos": {
            "get": {
                "tags": [
                    "Recurso: Checklists de segurança"
                ],
                "operationId": "listarChecklistModelos",
                "summary": "Listar Checklists de segurança",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "bloco.registo:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[fase]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Fase». Lista: a,b; intervalo: f[fase][de]= e f[fase][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativo». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_checklist_modelos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "checklist_modelos"
            },
            "post": {
                "tags": [
                    "Recurso: Checklists de segurança"
                ],
                "operationId": "criarChecklistModelos",
                "summary": "Criar Modelo de checklist",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "bloco.registo:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_checklist_modelos_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_checklist_modelos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_checklist_modelos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "checklist_modelos"
            }
        },
        "/r/checklist_modelos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Checklists de segurança"
                ],
                "operationId": "esquemaChecklistModelos",
                "summary": "Esquema de «Checklists de segurança» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "bloco.registo:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "checklist_modelos"
            }
        },
        "/r/checklist_modelos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Checklists de segurança"
                ],
                "operationId": "obterChecklistModelos",
                "summary": "Obter Modelo de checklist",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "bloco.registo:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_checklist_modelos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "checklist_modelos"
            },
            "put": {
                "tags": [
                    "Recurso: Checklists de segurança"
                ],
                "operationId": "alterarChecklistModelos",
                "summary": "Alterar Modelo de checklist",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "bloco.registo:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_checklist_modelos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_checklist_modelos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "checklist_modelos"
            },
            "delete": {
                "tags": [
                    "Recurso: Checklists de segurança"
                ],
                "operationId": "apagarChecklistModelos",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "bloco.registo:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "checklist_modelos"
            }
        },
        "/r/cirurgias": {
            "get": {
                "tags": [
                    "Recurso: Cirurgias"
                ],
                "operationId": "listarCirurgias",
                "summary": "Listar Cirurgias",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "bloco.mapa:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[inicio_previsto]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Data prevista». Lista: a,b; intervalo: f[inicio_previsto][de]= e f[inicio_previsto][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[sala_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Sala». Lista: a,b; intervalo: f[sala_id][de]= e f[sala_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tecnica]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Técnica». Lista: a,b; intervalo: f[tecnica][de]= e f[tecnica][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[aptidao]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Aptidão». Lista: a,b; intervalo: f[aptidao][de]= e f[aptidao][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_cirurgias"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "bloco.mapa",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "cirurgias"
            }
        },
        "/r/cirurgias/esquema": {
            "get": {
                "tags": [
                    "Recurso: Cirurgias"
                ],
                "operationId": "esquemaCirurgias",
                "summary": "Esquema de «Cirurgias» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "bloco.mapa:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "bloco.mapa",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "cirurgias"
            }
        },
        "/r/cirurgias/{id}": {
            "get": {
                "tags": [
                    "Recurso: Cirurgias"
                ],
                "operationId": "obterCirurgias",
                "summary": "Obter Cirurgia",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "bloco.mapa:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_cirurgias"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "bloco.mapa",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "cirurgias"
            }
        },
        "/r/clinicas": {
            "get": {
                "tags": [
                    "Recurso: Clínicas"
                ],
                "operationId": "listarClinicas",
                "summary": "Listar Clínicas",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[ativa]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativa». Lista: a,b; intervalo: f[ativa][de]= e f[ativa][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_clinicas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "clinicas"
            },
            "post": {
                "tags": [
                    "Recurso: Clínicas"
                ],
                "operationId": "criarClinicas",
                "summary": "Criar Clínica",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_clinicas_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_clinicas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_clinicas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "clinicas"
            }
        },
        "/r/clinicas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Clínicas"
                ],
                "operationId": "esquemaClinicas",
                "summary": "Esquema de «Clínicas» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "clinicas"
            }
        },
        "/r/clinicas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Clínicas"
                ],
                "operationId": "obterClinicas",
                "summary": "Obter Clínica",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_clinicas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "clinicas"
            },
            "put": {
                "tags": [
                    "Recurso: Clínicas"
                ],
                "operationId": "alterarClinicas",
                "summary": "Alterar Clínica",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_clinicas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_clinicas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "clinicas"
            }
        },
        "/r/cms_blocos": {
            "get": {
                "tags": [
                    "Recurso: Blocos do site"
                ],
                "operationId": "listarCmsBlocos",
                "summary": "Listar Blocos do site",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "site.cms:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[pagina]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Página». Lista: a,b; intervalo: f[pagina][de]= e f[pagina][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[idioma]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Língua». Lista: a,b; intervalo: f[idioma][de]= e f[idioma][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_cms_blocos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "cms_blocos"
            }
        },
        "/r/cms_blocos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Blocos do site"
                ],
                "operationId": "esquemaCmsBlocos",
                "summary": "Esquema de «Blocos do site» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "site.cms:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "cms_blocos"
            }
        },
        "/r/cms_blocos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Blocos do site"
                ],
                "operationId": "obterCmsBlocos",
                "summary": "Obter Bloco",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "site.cms:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_cms_blocos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "cms_blocos"
            },
            "put": {
                "tags": [
                    "Recurso: Blocos do site"
                ],
                "operationId": "alterarCmsBlocos",
                "summary": "Alterar Bloco",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "site.cms:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_cms_blocos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_cms_blocos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "cms_blocos"
            }
        },
        "/r/cms_paginas": {
            "get": {
                "tags": [
                    "Recurso: Páginas do site"
                ],
                "operationId": "listarCmsPaginas",
                "summary": "Listar Páginas do site",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "site.cms:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[idioma]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Língua». Lista: a,b; intervalo: f[idioma][de]= e f[idioma][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[publicada]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Publicada». Lista: a,b; intervalo: f[publicada][de]= e f[publicada][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_cms_paginas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "cms_paginas"
            },
            "post": {
                "tags": [
                    "Recurso: Páginas do site"
                ],
                "operationId": "criarCmsPaginas",
                "summary": "Criar Página",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "site.cms:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_cms_paginas_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_cms_paginas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_cms_paginas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "cms_paginas"
            }
        },
        "/r/cms_paginas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Páginas do site"
                ],
                "operationId": "esquemaCmsPaginas",
                "summary": "Esquema de «Páginas do site» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "site.cms:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "cms_paginas"
            }
        },
        "/r/cms_paginas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Páginas do site"
                ],
                "operationId": "obterCmsPaginas",
                "summary": "Obter Página",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "site.cms:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_cms_paginas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "cms_paginas"
            },
            "put": {
                "tags": [
                    "Recurso: Páginas do site"
                ],
                "operationId": "alterarCmsPaginas",
                "summary": "Alterar Página",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "site.cms:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_cms_paginas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_cms_paginas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "cms_paginas"
            },
            "delete": {
                "tags": [
                    "Recurso: Páginas do site"
                ],
                "operationId": "apagarCmsPaginas",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "site.cms:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "cms_paginas"
            }
        },
        "/r/cms_paginas/{id}/acao/despublicar": {
            "post": {
                "tags": [
                    "Recurso: Páginas do site"
                ],
                "operationId": "acaoDespublicarCmsPaginas",
                "summary": "Ação: Retirar do site",
                "description": "Nível exigido: editar. Retirar esta página do site?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "site.cms:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "cms_paginas"
            }
        },
        "/r/cms_paginas/{id}/acao/previsualizar": {
            "post": {
                "tags": [
                    "Recurso: Páginas do site"
                ],
                "operationId": "acaoPrevisualizarCmsPaginas",
                "summary": "Ação: Pré-visualizar",
                "description": "Nível exigido: ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "site.cms:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "ver",
                "x-anagen-recurso": "cms_paginas"
            }
        },
        "/r/cms_paginas/{id}/acao/publicar": {
            "post": {
                "tags": [
                    "Recurso: Páginas do site"
                ],
                "operationId": "acaoPublicarCmsPaginas",
                "summary": "Ação: Publicar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "site.cms:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Motivo da alteração",
                                        "maxLength": 255
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "cms_paginas"
            }
        },
        "/r/codigos_desconto": {
            "get": {
                "tags": [
                    "Recurso: Códigos de desconto"
                ],
                "operationId": "listarCodigosDesconto",
                "summary": "Listar Códigos de desconto",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.descontos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[valido_ate]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Válido até». Lista: a,b; intervalo: f[valido_ate][de]= e f[valido_ate][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativo». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_codigos_desconto"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "comercial.descontos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "codigos_desconto"
            },
            "post": {
                "tags": [
                    "Recurso: Códigos de desconto"
                ],
                "operationId": "criarCodigosDesconto",
                "summary": "Criar Código de desconto",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.descontos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_codigos_desconto_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_codigos_desconto_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_codigos_desconto"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "comercial.descontos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "codigos_desconto"
            }
        },
        "/r/codigos_desconto/esquema": {
            "get": {
                "tags": [
                    "Recurso: Códigos de desconto"
                ],
                "operationId": "esquemaCodigosDesconto",
                "summary": "Esquema de «Códigos de desconto» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.descontos:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "comercial.descontos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "codigos_desconto"
            }
        },
        "/r/codigos_desconto/{id}": {
            "get": {
                "tags": [
                    "Recurso: Códigos de desconto"
                ],
                "operationId": "obterCodigosDesconto",
                "summary": "Obter Código de desconto",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.descontos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_codigos_desconto"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "comercial.descontos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "codigos_desconto"
            },
            "put": {
                "tags": [
                    "Recurso: Códigos de desconto"
                ],
                "operationId": "alterarCodigosDesconto",
                "summary": "Alterar Código de desconto",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.descontos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_codigos_desconto_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_codigos_desconto"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "comercial.descontos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "codigos_desconto"
            },
            "delete": {
                "tags": [
                    "Recurso: Códigos de desconto"
                ],
                "operationId": "apagarCodigosDesconto",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.descontos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "comercial.descontos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "codigos_desconto"
            }
        },
        "/r/comissoes": {
            "get": {
                "tags": [
                    "Recurso: Comissões"
                ],
                "operationId": "listarComissoes",
                "summary": "Listar Comissões",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[utilizador_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Pessoa». Lista: a,b; intervalo: f[utilizador_id][de]= e f[utilizador_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[proposta_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Proposta». Lista: a,b; intervalo: f[proposta_id][de]= e f[proposta_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[vence_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Vence em». Lista: a,b; intervalo: f[vence_em][de]= e f[vence_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[paga_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paga em». Lista: a,b; intervalo: f[paga_em][de]= e f[paga_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_comissoes"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "comissoes"
            },
            "post": {
                "tags": [
                    "Recurso: Comissões"
                ],
                "operationId": "criarComissoes",
                "summary": "Criar Comissão",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_comissoes_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_comissoes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_comissoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "comissoes"
            }
        },
        "/r/comissoes/esquema": {
            "get": {
                "tags": [
                    "Recurso: Comissões"
                ],
                "operationId": "esquemaComissoes",
                "summary": "Esquema de «Comissões» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "comissoes"
            }
        },
        "/r/comissoes/{id}": {
            "get": {
                "tags": [
                    "Recurso: Comissões"
                ],
                "operationId": "obterComissoes",
                "summary": "Obter Comissão",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_comissoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "comissoes"
            },
            "put": {
                "tags": [
                    "Recurso: Comissões"
                ],
                "operationId": "alterarComissoes",
                "summary": "Alterar Comissão",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_comissoes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_comissoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "comissoes"
            }
        },
        "/r/comissoes/{id}/acao/estornar": {
            "post": {
                "tags": [
                    "Recurso: Comissões"
                ],
                "operationId": "acaoEstornarComissoes",
                "summary": "Ação: Estornar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Motivo do estorno",
                                        "maxLength": 255
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "comissoes"
            }
        },
        "/r/comissoes/{id}/acao/marcar_paga": {
            "post": {
                "tags": [
                    "Recurso: Comissões"
                ],
                "operationId": "acaoMarcarPagaComissoes",
                "summary": "Ação: Marcar como paga",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "referencia": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Referência do pagamento",
                                        "maxLength": 80
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "comissoes"
            }
        },
        "/r/comissoes_regras": {
            "get": {
                "tags": [
                    "Recurso: Regras de comissões"
                ],
                "operationId": "listarComissoesRegras",
                "summary": "Listar Regras de comissões",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[utilizador_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Pessoa». Lista: a,b; intervalo: f[utilizador_id][de]= e f[utilizador_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativa]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativa». Lista: a,b; intervalo: f[ativa][de]= e f[ativa][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_comissoes_regras"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "comissoes_regras"
            },
            "post": {
                "tags": [
                    "Recurso: Regras de comissões"
                ],
                "operationId": "criarComissoesRegras",
                "summary": "Criar Regra de comissão",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_comissoes_regras_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_comissoes_regras_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_comissoes_regras"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "comissoes_regras"
            }
        },
        "/r/comissoes_regras/esquema": {
            "get": {
                "tags": [
                    "Recurso: Regras de comissões"
                ],
                "operationId": "esquemaComissoesRegras",
                "summary": "Esquema de «Regras de comissões» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "comissoes_regras"
            }
        },
        "/r/comissoes_regras/{id}": {
            "get": {
                "tags": [
                    "Recurso: Regras de comissões"
                ],
                "operationId": "obterComissoesRegras",
                "summary": "Obter Regra de comissão",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_comissoes_regras"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "comissoes_regras"
            },
            "put": {
                "tags": [
                    "Recurso: Regras de comissões"
                ],
                "operationId": "alterarComissoesRegras",
                "summary": "Alterar Regra de comissão",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_comissoes_regras_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_comissoes_regras"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "comissoes_regras"
            },
            "delete": {
                "tags": [
                    "Recurso: Regras de comissões"
                ],
                "operationId": "apagarComissoesRegras",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "comissoes_regras"
            }
        },
        "/r/complicacoes": {
            "get": {
                "tags": [
                    "Recurso: Complicações"
                ],
                "operationId": "listarComplicacoes",
                "summary": "Listar Complicações",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão. Cada leitura fica na auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[episodio_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Episódio». Lista: a,b; intervalo: f[episodio_id][de]= e f[episodio_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[gravidade]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Gravidade». Lista: a,b; intervalo: f[gravidade][de]= e f[gravidade][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[data]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Data». Lista: a,b; intervalo: f[data][de]= e f[data][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[recall]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Chamar o paciente». Lista: a,b; intervalo: f[recall][de]= e f[recall][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[recall_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Data da chamada». Lista: a,b; intervalo: f[recall_em][de]= e f[recall_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_complicacoes"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "complicacoes"
            },
            "post": {
                "tags": [
                    "Recurso: Complicações"
                ],
                "operationId": "criarComplicacoes",
                "summary": "Criar Complicação",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_complicacoes_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_complicacoes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_complicacoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "complicacoes"
            }
        },
        "/r/complicacoes/esquema": {
            "get": {
                "tags": [
                    "Recurso: Complicações"
                ],
                "operationId": "esquemaComplicacoes",
                "summary": "Esquema de «Complicações» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "complicacoes"
            }
        },
        "/r/complicacoes/{id}": {
            "get": {
                "tags": [
                    "Recurso: Complicações"
                ],
                "operationId": "obterComplicacoes",
                "summary": "Obter Complicação",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_complicacoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "complicacoes"
            },
            "put": {
                "tags": [
                    "Recurso: Complicações"
                ],
                "operationId": "alterarComplicacoes",
                "summary": "Alterar Complicação",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_complicacoes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_complicacoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "complicacoes"
            }
        },
        "/r/complicacoes/{id}/acao/reabrir": {
            "post": {
                "tags": [
                    "Recurso: Complicações"
                ],
                "operationId": "acaoReabrirComplicacoes",
                "summary": "Ação: Reabrir",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "complicacoes"
            }
        },
        "/r/complicacoes/{id}/acao/resolver": {
            "post": {
                "tags": [
                    "Recurso: Complicações"
                ],
                "operationId": "acaoResolverComplicacoes",
                "summary": "Ação: Marcar como resolvida",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "complicacoes"
            }
        },
        "/r/comunicados": {
            "get": {
                "tags": [
                    "Recurso: Comunicados"
                ],
                "operationId": "listarComunicados",
                "summary": "Listar Comunicados",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[publico]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Para quem». Lista: a,b; intervalo: f[publico][de]= e f[publico][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[publicado_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Publicar em». Lista: a,b; intervalo: f[publicado_em][de]= e f[publicado_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_comunicados"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "comunicados"
            },
            "post": {
                "tags": [
                    "Recurso: Comunicados"
                ],
                "operationId": "criarComunicados",
                "summary": "Criar Comunicado",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_comunicados_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_comunicados_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_comunicados"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "comunicados"
            }
        },
        "/r/comunicados/esquema": {
            "get": {
                "tags": [
                    "Recurso: Comunicados"
                ],
                "operationId": "esquemaComunicados",
                "summary": "Esquema de «Comunicados» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "comunicados"
            }
        },
        "/r/comunicados/{id}": {
            "get": {
                "tags": [
                    "Recurso: Comunicados"
                ],
                "operationId": "obterComunicados",
                "summary": "Obter Comunicado",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_comunicados"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "comunicados"
            },
            "put": {
                "tags": [
                    "Recurso: Comunicados"
                ],
                "operationId": "alterarComunicados",
                "summary": "Alterar Comunicado",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_comunicados_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_comunicados"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "comunicados"
            },
            "delete": {
                "tags": [
                    "Recurso: Comunicados"
                ],
                "operationId": "apagarComunicados",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "comunicados"
            }
        },
        "/r/comunicados/{id}/acao/confirmar": {
            "post": {
                "tags": [
                    "Recurso: Comunicados"
                ],
                "operationId": "acaoConfirmarComunicados",
                "summary": "Ação: Li e tomei conhecimento",
                "description": "Nível exigido: ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "ver",
                "x-anagen-recurso": "comunicados"
            }
        },
        "/r/comunicados/{id}/acao/lembrar": {
            "post": {
                "tags": [
                    "Recurso: Comunicados"
                ],
                "operationId": "acaoLembrarComunicados",
                "summary": "Ação: Lembrar quem falta ler",
                "description": "Nível exigido: editar. Enviar um lembrete a quem ainda não confirmou a leitura?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "comunicados"
            }
        },
        "/r/consentimento_modelos": {
            "get": {
                "tags": [
                    "Recurso: Modelos de consentimento"
                ],
                "operationId": "listarConsentimentoModelos",
                "summary": "Listar Modelos de consentimento",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[finalidade]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Finalidade». Lista: a,b; intervalo: f[finalidade][de]= e f[finalidade][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[base_legal]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Fundamento jurídico». Lista: a,b; intervalo: f[base_legal][de]= e f[base_legal][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[idioma]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Língua». Lista: a,b; intervalo: f[idioma][de]= e f[idioma][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tecnica]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Técnica». Lista: a,b; intervalo: f[tecnica][de]= e f[tecnica][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_consentimento_modelos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "consentimento_modelos"
            },
            "post": {
                "tags": [
                    "Recurso: Modelos de consentimento"
                ],
                "operationId": "criarConsentimentoModelos",
                "summary": "Criar Modelo de consentimento",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_consentimento_modelos_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_consentimento_modelos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_consentimento_modelos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "consentimento_modelos"
            }
        },
        "/r/consentimento_modelos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Modelos de consentimento"
                ],
                "operationId": "esquemaConsentimentoModelos",
                "summary": "Esquema de «Modelos de consentimento» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "consentimento_modelos"
            }
        },
        "/r/consentimento_modelos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Modelos de consentimento"
                ],
                "operationId": "obterConsentimentoModelos",
                "summary": "Obter Modelo de consentimento",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_consentimento_modelos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "consentimento_modelos"
            },
            "put": {
                "tags": [
                    "Recurso: Modelos de consentimento"
                ],
                "operationId": "alterarConsentimentoModelos",
                "summary": "Alterar Modelo de consentimento",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_consentimento_modelos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_consentimento_modelos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "consentimento_modelos"
            },
            "delete": {
                "tags": [
                    "Recurso: Modelos de consentimento"
                ],
                "operationId": "apagarConsentimentoModelos",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "consentimento_modelos"
            }
        },
        "/r/consentimento_modelos/{id}/acao/aprovar": {
            "post": {
                "tags": [
                    "Recurso: Modelos de consentimento"
                ],
                "operationId": "acaoAprovarConsentimentoModelos",
                "summary": "Ação: Aprovar",
                "description": "Nível exigido: ver. Aprovar esta versão? Passa a ser a apresentada aos pacientes e a versão anterior é arquivada. Depois de aprovada não pode ser alterada.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "ver",
                "x-anagen-recurso": "consentimento_modelos"
            }
        },
        "/r/consentimento_modelos/{id}/acao/arquivar": {
            "post": {
                "tags": [
                    "Recurso: Modelos de consentimento"
                ],
                "operationId": "acaoArquivarConsentimentoModelos",
                "summary": "Ação: Arquivar",
                "description": "Nível exigido: editar. Arquivar este modelo? Deixa de ser apresentado; os consentimentos já registados mantêm-se.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "consentimento_modelos"
            }
        },
        "/r/consentimento_modelos/{id}/acao/nova_versao": {
            "post": {
                "tags": [
                    "Recurso: Modelos de consentimento"
                ],
                "operationId": "acaoNovaVersaoConsentimentoModelos",
                "summary": "Ação: Nova versão",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "consentimento_modelos"
            }
        },
        "/r/consentimentos": {
            "get": {
                "tags": [
                    "Recurso: Registo de consentimentos"
                ],
                "operationId": "listarConsentimentos",
                "summary": "Listar Registo de consentimentos",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.consentimentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[finalidade]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Finalidade». Lista: a,b; intervalo: f[finalidade][de]= e f[finalidade][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[decisao]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Decisão». Lista: a,b; intervalo: f[decisao][de]= e f[decisao][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[modelo_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Modelo». Lista: a,b; intervalo: f[modelo_id][de]= e f[modelo_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[canal]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Canal». Lista: a,b; intervalo: f[canal][de]= e f[canal][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[episodio_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Episódio». Lista: a,b; intervalo: f[episodio_id][de]= e f[episodio_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[recolhido_por]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Recolhido por». Lista: a,b; intervalo: f[recolhido_por][de]= e f[recolhido_por][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[criado_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Registado em». Lista: a,b; intervalo: f[criado_em][de]= e f[criado_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_consentimentos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.consentimentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "consentimentos"
            }
        },
        "/r/consentimentos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Registo de consentimentos"
                ],
                "operationId": "esquemaConsentimentos",
                "summary": "Esquema de «Registo de consentimentos» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.consentimentos:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.consentimentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "consentimentos"
            }
        },
        "/r/consentimentos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Registo de consentimentos"
                ],
                "operationId": "obterConsentimentos",
                "summary": "Obter Consentimento",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.consentimentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_consentimentos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.consentimentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "consentimentos"
            }
        },
        "/r/consentimentos/{id}/acao/exportar_prova": {
            "post": {
                "tags": [
                    "Recurso: Registo de consentimentos"
                ],
                "operationId": "acaoExportarProvaConsentimentos",
                "summary": "Ação: Exportar prova",
                "description": "Nível exigido: ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.consentimentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.consentimentos",
                "x-anagen-nivel": "ver",
                "x-anagen-recurso": "consentimentos"
            }
        },
        "/r/consentimentos/{id}/acao/revogar": {
            "post": {
                "tags": [
                    "Recurso: Registo de consentimentos"
                ],
                "operationId": "acaoRevogarConsentimentos",
                "summary": "Ação: Retirar consentimento",
                "description": "Nível exigido: editar. Registar a retirada deste consentimento? Os efeitos são aplicados de imediato (por exemplo, fim das comunicações de marketing ou retirada de imagens publicadas).",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.consentimentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Motivo",
                                        "maxLength": 500
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.consentimentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "consentimentos"
            }
        },
        "/r/conservacao_regras": {
            "get": {
                "tags": [
                    "Recurso: Prazos de conservação"
                ],
                "operationId": "listarConservacaoRegras",
                "summary": "Listar Prazos de conservação",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[categoria]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Categoria». Lista: a,b; intervalo: f[categoria][de]= e f[categoria][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[acao]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «No fim do prazo». Lista: a,b; intervalo: f[acao][de]= e f[acao][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativa]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativa». Lista: a,b; intervalo: f[ativa][de]= e f[ativa][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_conservacao_regras"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "conservacao_regras"
            },
            "post": {
                "tags": [
                    "Recurso: Prazos de conservação"
                ],
                "operationId": "criarConservacaoRegras",
                "summary": "Criar Regra de conservação",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_conservacao_regras_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_conservacao_regras_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_conservacao_regras"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "conservacao_regras"
            }
        },
        "/r/conservacao_regras/esquema": {
            "get": {
                "tags": [
                    "Recurso: Prazos de conservação"
                ],
                "operationId": "esquemaConservacaoRegras",
                "summary": "Esquema de «Prazos de conservação» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "conservacao_regras"
            }
        },
        "/r/conservacao_regras/{id}": {
            "get": {
                "tags": [
                    "Recurso: Prazos de conservação"
                ],
                "operationId": "obterConservacaoRegras",
                "summary": "Obter Regra de conservação",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_conservacao_regras"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "conservacao_regras"
            },
            "put": {
                "tags": [
                    "Recurso: Prazos de conservação"
                ],
                "operationId": "alterarConservacaoRegras",
                "summary": "Alterar Regra de conservação",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_conservacao_regras_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_conservacao_regras"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "conservacao_regras"
            },
            "delete": {
                "tags": [
                    "Recurso: Prazos de conservação"
                ],
                "operationId": "apagarConservacaoRegras",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "conservacao_regras"
            }
        },
        "/r/conservacao_regras/{id}/acao/executar_agora": {
            "post": {
                "tags": [
                    "Recurso: Prazos de conservação"
                ],
                "operationId": "acaoExecutarAgoraConservacaoRegras",
                "summary": "Ação: Executar agora",
                "description": "Nível exigido: editar. Executar esta regra agora? Os registos fora do prazo são tratados de imediato.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "conservacao_regras"
            }
        },
        "/r/consultas": {
            "get": {
                "tags": [
                    "Recurso: Consultas"
                ],
                "operationId": "listarConsultas",
                "summary": "Listar Consultas",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão. Cada leitura fica na auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[episodio_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Episódio». Lista: a,b; intervalo: f[episodio_id][de]= e f[episodio_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[data]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Data». Lista: a,b; intervalo: f[data][de]= e f[data][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo de consulta». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[medico_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Médico». Lista: a,b; intervalo: f[medico_id][de]= e f[medico_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[elegibilidade]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Elegibilidade». Lista: a,b; intervalo: f[elegibilidade][de]= e f[elegibilidade][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[escala]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Escala». Lista: a,b; intervalo: f[escala][de]= e f[escala][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tecnica]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Técnica». Lista: a,b; intervalo: f[tecnica][de]= e f[tecnica][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[viabilidade]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Viabilidade». Lista: a,b; intervalo: f[viabilidade][de]= e f[viabilidade][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_consultas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "consultas"
            }
        },
        "/r/consultas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Consultas"
                ],
                "operationId": "esquemaConsultas",
                "summary": "Esquema de «Consultas» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "consultas"
            }
        },
        "/r/consultas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Consultas"
                ],
                "operationId": "obterConsultas",
                "summary": "Obter Consulta",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_consultas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "consultas"
            },
            "delete": {
                "tags": [
                    "Recurso: Consultas"
                ],
                "operationId": "apagarConsultas",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "consultas"
            }
        },
        "/r/contas_pagadoras": {
            "get": {
                "tags": [
                    "Recurso: Contas pagadoras"
                ],
                "operationId": "listarContasPagadoras",
                "summary": "Listar Contas pagadoras",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[localidade]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Localidade». Lista: a,b; intervalo: f[localidade][de]= e f[localidade][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[entidade_publica]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Entidade pública». Lista: a,b; intervalo: f[entidade_publica][de]= e f[entidade_publica][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativa]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativa». Lista: a,b; intervalo: f[ativa][de]= e f[ativa][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_contas_pagadoras"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "contas_pagadoras"
            },
            "post": {
                "tags": [
                    "Recurso: Contas pagadoras"
                ],
                "operationId": "criarContasPagadoras",
                "summary": "Criar Conta pagadora",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_contas_pagadoras_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_contas_pagadoras_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_contas_pagadoras"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "contas_pagadoras"
            }
        },
        "/r/contas_pagadoras/esquema": {
            "get": {
                "tags": [
                    "Recurso: Contas pagadoras"
                ],
                "operationId": "esquemaContasPagadoras",
                "summary": "Esquema de «Contas pagadoras» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "contas_pagadoras"
            }
        },
        "/r/contas_pagadoras/{id}": {
            "get": {
                "tags": [
                    "Recurso: Contas pagadoras"
                ],
                "operationId": "obterContasPagadoras",
                "summary": "Obter Conta pagadora",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_contas_pagadoras"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "contas_pagadoras"
            },
            "put": {
                "tags": [
                    "Recurso: Contas pagadoras"
                ],
                "operationId": "alterarContasPagadoras",
                "summary": "Alterar Conta pagadora",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_contas_pagadoras_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_contas_pagadoras"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "contas_pagadoras"
            },
            "delete": {
                "tags": [
                    "Recurso: Contas pagadoras"
                ],
                "operationId": "apagarContasPagadoras",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "contas_pagadoras"
            }
        },
        "/r/contas_subcontas": {
            "get": {
                "tags": [
                    "Recurso: Subcontas"
                ],
                "operationId": "listarContasSubcontas",
                "summary": "Listar Subcontas",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[conta_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Conta pagadora». Lista: a,b; intervalo: f[conta_id][de]= e f[conta_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativa]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativa». Lista: a,b; intervalo: f[ativa][de]= e f[ativa][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_contas_subcontas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "contas_subcontas"
            },
            "post": {
                "tags": [
                    "Recurso: Subcontas"
                ],
                "operationId": "criarContasSubcontas",
                "summary": "Criar Subconta",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_contas_subcontas_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_contas_subcontas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_contas_subcontas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "contas_subcontas"
            }
        },
        "/r/contas_subcontas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Subcontas"
                ],
                "operationId": "esquemaContasSubcontas",
                "summary": "Esquema de «Subcontas» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "contas_subcontas"
            }
        },
        "/r/contas_subcontas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Subcontas"
                ],
                "operationId": "obterContasSubcontas",
                "summary": "Obter Subconta",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_contas_subcontas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "contas_subcontas"
            },
            "put": {
                "tags": [
                    "Recurso: Subcontas"
                ],
                "operationId": "alterarContasSubcontas",
                "summary": "Alterar Subconta",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_contas_subcontas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_contas_subcontas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "contas_subcontas"
            },
            "delete": {
                "tags": [
                    "Recurso: Subcontas"
                ],
                "operationId": "apagarContasSubcontas",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "contas_subcontas"
            }
        },
        "/r/convencoes": {
            "get": {
                "tags": [
                    "Recurso: Convenções"
                ],
                "operationId": "listarConvencoes",
                "summary": "Listar Convenções",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[conta_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Entidade (conta pagadora)». Lista: a,b; intervalo: f[conta_id][de]= e f[conta_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativa]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativa». Lista: a,b; intervalo: f[ativa][de]= e f[ativa][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_convencoes"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "convencoes"
            },
            "post": {
                "tags": [
                    "Recurso: Convenções"
                ],
                "operationId": "criarConvencoes",
                "summary": "Criar Convenção",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_convencoes_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_convencoes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_convencoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "convencoes"
            }
        },
        "/r/convencoes/esquema": {
            "get": {
                "tags": [
                    "Recurso: Convenções"
                ],
                "operationId": "esquemaConvencoes",
                "summary": "Esquema de «Convenções» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "convencoes"
            }
        },
        "/r/convencoes/{id}": {
            "get": {
                "tags": [
                    "Recurso: Convenções"
                ],
                "operationId": "obterConvencoes",
                "summary": "Obter Convenção",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_convencoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "convencoes"
            },
            "put": {
                "tags": [
                    "Recurso: Convenções"
                ],
                "operationId": "alterarConvencoes",
                "summary": "Alterar Convenção",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_convencoes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_convencoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "convencoes"
            },
            "delete": {
                "tags": [
                    "Recurso: Convenções"
                ],
                "operationId": "apagarConvencoes",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "convencoes"
            }
        },
        "/r/convencoes_atos": {
            "get": {
                "tags": [
                    "Recurso: Atos da convenção"
                ],
                "operationId": "listarConvencoesAtos",
                "summary": "Listar Atos da convenção",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[convencao_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Convenção». Lista: a,b; intervalo: f[convencao_id][de]= e f[convencao_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[procedimento_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Procedimento». Lista: a,b; intervalo: f[procedimento_id][de]= e f[procedimento_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativo». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_convencoes_atos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "convencoes_atos"
            },
            "post": {
                "tags": [
                    "Recurso: Atos da convenção"
                ],
                "operationId": "criarConvencoesAtos",
                "summary": "Criar Ato da convenção",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_convencoes_atos_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_convencoes_atos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_convencoes_atos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "convencoes_atos"
            }
        },
        "/r/convencoes_atos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Atos da convenção"
                ],
                "operationId": "esquemaConvencoesAtos",
                "summary": "Esquema de «Atos da convenção» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "convencoes_atos"
            }
        },
        "/r/convencoes_atos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Atos da convenção"
                ],
                "operationId": "obterConvencoesAtos",
                "summary": "Obter Ato da convenção",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_convencoes_atos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "convencoes_atos"
            },
            "put": {
                "tags": [
                    "Recurso: Atos da convenção"
                ],
                "operationId": "alterarConvencoesAtos",
                "summary": "Alterar Ato da convenção",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_convencoes_atos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_convencoes_atos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "convencoes_atos"
            },
            "delete": {
                "tags": [
                    "Recurso: Atos da convenção"
                ],
                "operationId": "apagarConvencoesAtos",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "convencoes_atos"
            }
        },
        "/r/conversas": {
            "get": {
                "tags": [
                    "Recurso: Conversas"
                ],
                "operationId": "listarConversas",
                "summary": "Listar Conversas",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[canal]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Canal». Lista: a,b; intervalo: f[canal][de]= e f[canal][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[departamento]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Departamento». Lista: a,b; intervalo: f[departamento][de]= e f[departamento][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[atribuida_a]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Atribuída a». Lista: a,b; intervalo: f[atribuida_a][de]= e f[atribuida_a][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ia_a_tratar]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «IA a tratar». Lista: a,b; intervalo: f[ia_a_tratar][de]= e f[ia_a_tratar][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ultima_mensagem_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Última mensagem». Lista: a,b; intervalo: f[ultima_mensagem_em][de]= e f[ultima_mensagem_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[avaliacao]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Avaliação (1–5)». Lista: a,b; intervalo: f[avaliacao][de]= e f[avaliacao][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_conversas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "conversas"
            }
        },
        "/r/conversas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Conversas"
                ],
                "operationId": "esquemaConversas",
                "summary": "Esquema de «Conversas» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "conversas"
            }
        },
        "/r/conversas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Conversas"
                ],
                "operationId": "obterConversas",
                "summary": "Obter Conversa",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_conversas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "conversas"
            },
            "put": {
                "tags": [
                    "Recurso: Conversas"
                ],
                "operationId": "alterarConversas",
                "summary": "Alterar Conversa",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_conversas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_conversas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "conversas"
            }
        },
        "/r/cuidados_conteudos": {
            "get": {
                "tags": [
                    "Recurso: Cuidados por fase"
                ],
                "operationId": "listarCuidadosConteudos",
                "summary": "Listar Cuidados por fase",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[procedimento_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Procedimento». Lista: a,b; intervalo: f[procedimento_id][de]= e f[procedimento_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[idioma]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Língua». Lista: a,b; intervalo: f[idioma][de]= e f[idioma][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_cuidados_conteudos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "cuidados_conteudos"
            },
            "post": {
                "tags": [
                    "Recurso: Cuidados por fase"
                ],
                "operationId": "criarCuidadosConteudos",
                "summary": "Criar Conteúdo de cuidados",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_cuidados_conteudos_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_cuidados_conteudos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_cuidados_conteudos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "cuidados_conteudos"
            }
        },
        "/r/cuidados_conteudos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Cuidados por fase"
                ],
                "operationId": "esquemaCuidadosConteudos",
                "summary": "Esquema de «Cuidados por fase» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "cuidados_conteudos"
            }
        },
        "/r/cuidados_conteudos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Cuidados por fase"
                ],
                "operationId": "obterCuidadosConteudos",
                "summary": "Obter Conteúdo de cuidados",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_cuidados_conteudos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "cuidados_conteudos"
            },
            "put": {
                "tags": [
                    "Recurso: Cuidados por fase"
                ],
                "operationId": "alterarCuidadosConteudos",
                "summary": "Alterar Conteúdo de cuidados",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_cuidados_conteudos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_cuidados_conteudos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "cuidados_conteudos"
            },
            "delete": {
                "tags": [
                    "Recurso: Cuidados por fase"
                ],
                "operationId": "apagarCuidadosConteudos",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "cuidados_conteudos"
            }
        },
        "/r/cuidados_conteudos/{id}/acao/aprovar": {
            "post": {
                "tags": [
                    "Recurso: Cuidados por fase"
                ],
                "operationId": "acaoAprovarCuidadosConteudos",
                "summary": "Ação: Aprovar",
                "description": "Nível exigido: editar. Aprovar este conteúdo para os pacientes?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "cuidados_conteudos"
            }
        },
        "/r/cuidados_conteudos/{id}/acao/devolver": {
            "post": {
                "tags": [
                    "Recurso: Cuidados por fase"
                ],
                "operationId": "acaoDevolverCuidadosConteudos",
                "summary": "Ação: Devolver para revisão",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "cuidados_conteudos"
            }
        },
        "/r/cuidados_conteudos/{id}/acao/retirar": {
            "post": {
                "tags": [
                    "Recurso: Cuidados por fase"
                ],
                "operationId": "acaoRetirarCuidadosConteudos",
                "summary": "Ação: Retirar",
                "description": "Nível exigido: editar. Retirar este conteúdo do portal e da app?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "cuidados_conteudos"
            }
        },
        "/r/cuidados_conteudos/{id}/acao/submeter": {
            "post": {
                "tags": [
                    "Recurso: Cuidados por fase"
                ],
                "operationId": "acaoSubmeterCuidadosConteudos",
                "summary": "Ação: Enviar para aprovação",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "cuidados_conteudos"
            }
        },
        "/r/custos_anuncios": {
            "get": {
                "tags": [
                    "Recurso: Custos de anúncios"
                ],
                "operationId": "listarCustosAnuncios",
                "summary": "Listar Custos de anúncios",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[plataforma]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Plataforma». Lista: a,b; intervalo: f[plataforma][de]= e f[plataforma][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[data]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Data». Lista: a,b; intervalo: f[data][de]= e f[data][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_custos_anuncios"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "custos_anuncios"
            },
            "post": {
                "tags": [
                    "Recurso: Custos de anúncios"
                ],
                "operationId": "criarCustosAnuncios",
                "summary": "Criar Custo de anúncio",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_custos_anuncios_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_custos_anuncios_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_custos_anuncios"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "custos_anuncios"
            }
        },
        "/r/custos_anuncios/esquema": {
            "get": {
                "tags": [
                    "Recurso: Custos de anúncios"
                ],
                "operationId": "esquemaCustosAnuncios",
                "summary": "Esquema de «Custos de anúncios» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "custos_anuncios"
            }
        },
        "/r/custos_anuncios/{id}": {
            "get": {
                "tags": [
                    "Recurso: Custos de anúncios"
                ],
                "operationId": "obterCustosAnuncios",
                "summary": "Obter Custo de anúncio",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_custos_anuncios"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "custos_anuncios"
            },
            "put": {
                "tags": [
                    "Recurso: Custos de anúncios"
                ],
                "operationId": "alterarCustosAnuncios",
                "summary": "Alterar Custo de anúncio",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_custos_anuncios_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_custos_anuncios"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "custos_anuncios"
            },
            "delete": {
                "tags": [
                    "Recurso: Custos de anúncios"
                ],
                "operationId": "apagarCustosAnuncios",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "custos_anuncios"
            }
        },
        "/r/datas_especiais": {
            "get": {
                "tags": [
                    "Recurso: Datas especiais"
                ],
                "operationId": "listarDatasEspeciais",
                "summary": "Listar Datas especiais",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Data». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativa]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativa». Lista: a,b; intervalo: f[ativa][de]= e f[ativa][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_datas_especiais"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "datas_especiais"
            },
            "post": {
                "tags": [
                    "Recurso: Datas especiais"
                ],
                "operationId": "criarDatasEspeciais",
                "summary": "Criar Data especial",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_datas_especiais_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_datas_especiais_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_datas_especiais"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "datas_especiais"
            }
        },
        "/r/datas_especiais/esquema": {
            "get": {
                "tags": [
                    "Recurso: Datas especiais"
                ],
                "operationId": "esquemaDatasEspeciais",
                "summary": "Esquema de «Datas especiais» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "datas_especiais"
            }
        },
        "/r/datas_especiais/{id}": {
            "get": {
                "tags": [
                    "Recurso: Datas especiais"
                ],
                "operationId": "obterDatasEspeciais",
                "summary": "Obter Data especial",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_datas_especiais"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "datas_especiais"
            },
            "put": {
                "tags": [
                    "Recurso: Datas especiais"
                ],
                "operationId": "alterarDatasEspeciais",
                "summary": "Alterar Data especial",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_datas_especiais_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_datas_especiais"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "datas_especiais"
            },
            "delete": {
                "tags": [
                    "Recurso: Datas especiais"
                ],
                "operationId": "apagarDatasEspeciais",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "datas_especiais"
            }
        },
        "/r/datas_especiais/{id}/acao/processar": {
            "post": {
                "tags": [
                    "Recurso: Datas especiais"
                ],
                "operationId": "acaoProcessarDatasEspeciais",
                "summary": "Ação: Processar hoje",
                "description": "Nível exigido: editar. Enviar já as mensagens de hoje das regras ativas? Ninguém recebe duas vezes no mesmo ano.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "datas_especiais"
            }
        },
        "/r/delegacoes": {
            "get": {
                "tags": [
                    "Recurso: Delegações"
                ],
                "operationId": "listarDelegacoes",
                "summary": "Listar Delegações",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[de_utilizador_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Quem delega». Lista: a,b; intervalo: f[de_utilizador_id][de]= e f[de_utilizador_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[para_utilizador_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Quem recebe». Lista: a,b; intervalo: f[para_utilizador_id][de]= e f[para_utilizador_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativa]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativa». Lista: a,b; intervalo: f[ativa][de]= e f[ativa][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_delegacoes"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "delegacoes"
            },
            "post": {
                "tags": [
                    "Recurso: Delegações"
                ],
                "operationId": "criarDelegacoes",
                "summary": "Criar Delegação",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_delegacoes_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_delegacoes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_delegacoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "delegacoes"
            }
        },
        "/r/delegacoes/esquema": {
            "get": {
                "tags": [
                    "Recurso: Delegações"
                ],
                "operationId": "esquemaDelegacoes",
                "summary": "Esquema de «Delegações» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "delegacoes"
            }
        },
        "/r/delegacoes/{id}": {
            "get": {
                "tags": [
                    "Recurso: Delegações"
                ],
                "operationId": "obterDelegacoes",
                "summary": "Obter Delegação",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_delegacoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "delegacoes"
            },
            "put": {
                "tags": [
                    "Recurso: Delegações"
                ],
                "operationId": "alterarDelegacoes",
                "summary": "Alterar Delegação",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_delegacoes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_delegacoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "delegacoes"
            },
            "delete": {
                "tags": [
                    "Recurso: Delegações"
                ],
                "operationId": "apagarDelegacoes",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "delegacoes"
            }
        },
        "/r/delegacoes/{id}/acao/terminar": {
            "post": {
                "tags": [
                    "Recurso: Delegações"
                ],
                "operationId": "acaoTerminarDelegacoes",
                "summary": "Ação: Terminar",
                "description": "Nível exigido: editar. Terminar já esta delegação?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "delegacoes"
            }
        },
        "/r/diagnosticos_apoio": {
            "get": {
                "tags": [
                    "Recurso: Diagnósticos de apoio"
                ],
                "operationId": "listarDiagnosticosApoio",
                "summary": "Listar Diagnósticos de apoio",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativa]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativo». Lista: a,b; intervalo: f[ativa][de]= e f[ativa][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_diagnosticos_apoio"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "diagnosticos_apoio"
            },
            "post": {
                "tags": [
                    "Recurso: Diagnósticos de apoio"
                ],
                "operationId": "criarDiagnosticosApoio",
                "summary": "Criar Diagnóstico de apoio",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_diagnosticos_apoio_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_diagnosticos_apoio_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_diagnosticos_apoio"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "diagnosticos_apoio"
            }
        },
        "/r/diagnosticos_apoio/esquema": {
            "get": {
                "tags": [
                    "Recurso: Diagnósticos de apoio"
                ],
                "operationId": "esquemaDiagnosticosApoio",
                "summary": "Esquema de «Diagnósticos de apoio» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "diagnosticos_apoio"
            }
        },
        "/r/diagnosticos_apoio/{id}": {
            "get": {
                "tags": [
                    "Recurso: Diagnósticos de apoio"
                ],
                "operationId": "obterDiagnosticosApoio",
                "summary": "Obter Diagnóstico de apoio",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_diagnosticos_apoio"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "diagnosticos_apoio"
            },
            "put": {
                "tags": [
                    "Recurso: Diagnósticos de apoio"
                ],
                "operationId": "alterarDiagnosticosApoio",
                "summary": "Alterar Diagnóstico de apoio",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_diagnosticos_apoio_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_diagnosticos_apoio"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "diagnosticos_apoio"
            },
            "delete": {
                "tags": [
                    "Recurso: Diagnósticos de apoio"
                ],
                "operationId": "apagarDiagnosticosApoio",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "diagnosticos_apoio"
            }
        },
        "/r/diagnosticos_apoio/{id}/acao/alternar": {
            "post": {
                "tags": [
                    "Recurso: Diagnósticos de apoio"
                ],
                "operationId": "acaoAlternarDiagnosticosApoio",
                "summary": "Ação: Ativar / desativar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "diagnosticos_apoio"
            }
        },
        "/r/diagnosticos_apoio/{id}/acao/aprovar": {
            "post": {
                "tags": [
                    "Recurso: Diagnósticos de apoio"
                ],
                "operationId": "acaoAprovarDiagnosticosApoio",
                "summary": "Ação: Aprovar",
                "description": "Nível exigido: aprovar. Aprovar este diagnóstico? Passa a aparecer na lista de apoio das consultas.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "aprovar",
                "x-anagen-recurso": "diagnosticos_apoio"
            }
        },
        "/r/diagnosticos_apoio/{id}/acao/arquivar": {
            "post": {
                "tags": [
                    "Recurso: Diagnósticos de apoio"
                ],
                "operationId": "acaoArquivarDiagnosticosApoio",
                "summary": "Ação: Arquivar",
                "description": "Nível exigido: editar. Arquivar este diagnóstico? Deixa de aparecer nas consultas novas.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "diagnosticos_apoio"
            }
        },
        "/r/documento_modelos": {
            "get": {
                "tags": [
                    "Recurso: Modelos de documento"
                ],
                "operationId": "listarDocumentoModelos",
                "summary": "Listar Modelos de documento",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[idioma]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Língua». Lista: a,b; intervalo: f[idioma][de]= e f[idioma][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_documento_modelos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "documento_modelos"
            },
            "post": {
                "tags": [
                    "Recurso: Modelos de documento"
                ],
                "operationId": "criarDocumentoModelos",
                "summary": "Criar Modelo de documento",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_documento_modelos_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_documento_modelos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_documento_modelos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "documento_modelos"
            }
        },
        "/r/documento_modelos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Modelos de documento"
                ],
                "operationId": "esquemaDocumentoModelos",
                "summary": "Esquema de «Modelos de documento» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "documento_modelos"
            }
        },
        "/r/documento_modelos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Modelos de documento"
                ],
                "operationId": "obterDocumentoModelos",
                "summary": "Obter Modelo de documento",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_documento_modelos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "documento_modelos"
            },
            "put": {
                "tags": [
                    "Recurso: Modelos de documento"
                ],
                "operationId": "alterarDocumentoModelos",
                "summary": "Alterar Modelo de documento",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_documento_modelos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_documento_modelos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "documento_modelos"
            },
            "delete": {
                "tags": [
                    "Recurso: Modelos de documento"
                ],
                "operationId": "apagarDocumentoModelos",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "documento_modelos"
            }
        },
        "/r/documento_modelos/{id}/acao/aprovar": {
            "post": {
                "tags": [
                    "Recurso: Modelos de documento"
                ],
                "operationId": "acaoAprovarDocumentoModelos",
                "summary": "Ação: Aprovar",
                "description": "Nível exigido: ver. Aprovar esta versão? Passa a ser a apresentada aos pacientes e a versão anterior é arquivada. Depois de aprovada não pode ser alterada.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "ver",
                "x-anagen-recurso": "documento_modelos"
            }
        },
        "/r/documento_modelos/{id}/acao/arquivar": {
            "post": {
                "tags": [
                    "Recurso: Modelos de documento"
                ],
                "operationId": "acaoArquivarDocumentoModelos",
                "summary": "Ação: Arquivar",
                "description": "Nível exigido: editar. Arquivar este modelo? Deixa de ser apresentado; os consentimentos já registados mantêm-se.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "documento_modelos"
            }
        },
        "/r/documento_modelos/{id}/acao/emitir": {
            "post": {
                "tags": [
                    "Recurso: Modelos de documento"
                ],
                "operationId": "acaoEmitirDocumentoModelos",
                "summary": "Ação: Emitir documento",
                "description": "Nível exigido: ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "ver",
                "x-anagen-recurso": "documento_modelos"
            }
        },
        "/r/documento_modelos/{id}/acao/nova_versao": {
            "post": {
                "tags": [
                    "Recurso: Modelos de documento"
                ],
                "operationId": "acaoNovaVersaoDocumentoModelos",
                "summary": "Ação: Nova versão",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "documento_modelos"
            }
        },
        "/r/documentos": {
            "get": {
                "tags": [
                    "Recurso: Documentos emitidos"
                ],
                "operationId": "listarDocumentos",
                "summary": "Listar Documentos emitidos",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[episodio_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Episódio». Lista: a,b; intervalo: f[episodio_id][de]= e f[episodio_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[modelo_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Modelo». Lista: a,b; intervalo: f[modelo_id][de]= e f[modelo_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[assinatura_tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Assinatura». Lista: a,b; intervalo: f[assinatura_tipo][de]= e f[assinatura_tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[partilhado_paciente]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Documento partilhado no portal.». Lista: a,b; intervalo: f[partilhado_paciente][de]= e f[partilhado_paciente][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[assinado_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Assinado em». Lista: a,b; intervalo: f[assinado_em][de]= e f[assinado_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[criado_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Emitido em». Lista: a,b; intervalo: f[criado_em][de]= e f[criado_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_documentos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "documentos"
            }
        },
        "/r/documentos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Documentos emitidos"
                ],
                "operationId": "esquemaDocumentos",
                "summary": "Esquema de «Documentos emitidos» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "documentos"
            }
        },
        "/r/documentos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Documentos emitidos"
                ],
                "operationId": "obterDocumentos",
                "summary": "Obter Documento",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_documentos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "documentos"
            }
        },
        "/r/documentos/{id}/acao/anular": {
            "post": {
                "tags": [
                    "Recurso: Documentos emitidos"
                ],
                "operationId": "acaoAnularDocumentos",
                "summary": "Ação: Anular",
                "description": "Nível exigido: editar. Anular este documento? Continua no arquivo e a verificação pública passa a mostrá-lo como anulado.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Motivo",
                                        "maxLength": 500
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "documentos"
            }
        },
        "/r/documentos/{id}/acao/deixar_partilhar": {
            "post": {
                "tags": [
                    "Recurso: Documentos emitidos"
                ],
                "operationId": "acaoDeixarPartilharDocumentos",
                "summary": "Ação: Retirar do portal",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "documentos"
            }
        },
        "/r/documentos/{id}/acao/partilhar": {
            "post": {
                "tags": [
                    "Recurso: Documentos emitidos"
                ],
                "operationId": "acaoPartilharDocumentos",
                "summary": "Ação: Partilhar no portal",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "documentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "documentos"
            }
        },
        "/r/documentos_fiscais": {
            "get": {
                "tags": [
                    "Recurso: Documentos fiscais"
                ],
                "operationId": "listarDocumentosFiscais",
                "summary": "Listar Documentos fiscais",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[fornecedor]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Programa». Lista: a,b; intervalo: f[fornecedor][de]= e f[fornecedor][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[emitido_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Emitido em». Lista: a,b; intervalo: f[emitido_em][de]= e f[emitido_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[conta_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Conta pagadora». Lista: a,b; intervalo: f[conta_id][de]= e f[conta_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[eletronica_estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Fatura eletrónica». Lista: a,b; intervalo: f[eletronica_estado][de]= e f[eletronica_estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_documentos_fiscais"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "documentos_fiscais"
            }
        },
        "/r/documentos_fiscais/esquema": {
            "get": {
                "tags": [
                    "Recurso: Documentos fiscais"
                ],
                "operationId": "esquemaDocumentosFiscais",
                "summary": "Esquema de «Documentos fiscais» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "documentos_fiscais"
            }
        },
        "/r/documentos_fiscais/{id}": {
            "get": {
                "tags": [
                    "Recurso: Documentos fiscais"
                ],
                "operationId": "obterDocumentosFiscais",
                "summary": "Obter Documento fiscal",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_documentos_fiscais"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "documentos_fiscais"
            }
        },
        "/r/documentos_fiscais/{id}/acao/enviar_paciente": {
            "post": {
                "tags": [
                    "Recurso: Documentos fiscais"
                ],
                "operationId": "acaoEnviarPacienteDocumentosFiscais",
                "summary": "Ação: Enviar ao paciente",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "documentos_fiscais"
            }
        },
        "/r/documentos_fiscais/{id}/acao/nota_credito": {
            "post": {
                "tags": [
                    "Recurso: Documentos fiscais"
                ],
                "operationId": "acaoNotaCreditoDocumentosFiscais",
                "summary": "Ação: Emitir nota de crédito",
                "description": "Nível exigido: editar. Emitir nota de crédito? O documento original não se altera.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Motivo",
                                        "maxLength": 255
                                    },
                                    "valor": {
                                        "type": [
                                            "number",
                                            "null"
                                        ],
                                        "title": "Valor a creditar",
                                        "description": "Deixe vazio para creditar o total disponível.",
                                        "minimum": 0.01,
                                        "x-moeda": "EUR",
                                        "x-casas": 2
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "documentos_fiscais"
            }
        },
        "/r/documentos_fiscais/{id}/acao/reemitir": {
            "post": {
                "tags": [
                    "Recurso: Documentos fiscais"
                ],
                "operationId": "acaoReemitirDocumentosFiscais",
                "summary": "Ação: Tentar emitir de novo",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "documentos_fiscais"
            }
        },
        "/r/documentos_fiscais/{id}/acao/registar_eletronica": {
            "post": {
                "tags": [
                    "Recurso: Documentos fiscais"
                ],
                "operationId": "acaoRegistarEletronicaDocumentosFiscais",
                "summary": "Ação: Registar fatura eletrónica",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "formato": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Formato da fatura eletrónica",
                                        "enum": [
                                            "cius_pt",
                                            "pdf_assinado"
                                        ],
                                        "x-enum-rotulos": {
                                            "cius_pt": "CIUS-PT",
                                            "pdf_assinado": "PDF com assinatura qualificada"
                                        },
                                        "default": "cius_pt"
                                    },
                                    "referencia": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Referência da entrega",
                                        "description": "Referência dada pelo intermediário (eSPap, Saphety…) ou pelo prestador da assinatura.",
                                        "maxLength": 120
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "documentos_fiscais"
            }
        },
        "/r/documentos_fiscais/{id}/acao/registar_emissao": {
            "post": {
                "tags": [
                    "Recurso: Documentos fiscais"
                ],
                "operationId": "acaoRegistarEmissaoDocumentosFiscais",
                "summary": "Ação: Registar emissão",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "numero": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Número",
                                        "maxLength": 60
                                    },
                                    "serie": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Série",
                                        "maxLength": 40
                                    },
                                    "atcud": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "ATCUD",
                                        "maxLength": 80
                                    },
                                    "emitido_em": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date",
                                        "title": "Emitido em"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "documentos_fiscais"
            }
        },
        "/r/encomendas": {
            "get": {
                "tags": [
                    "Recurso: Encomendas"
                ],
                "operationId": "listarEncomendas",
                "summary": "Listar Encomendas",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[fornecedor]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Fornecedor». Lista: a,b; intervalo: f[fornecedor][de]= e f[fornecedor][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_encomendas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "encomendas"
            },
            "post": {
                "tags": [
                    "Recurso: Encomendas"
                ],
                "operationId": "criarEncomendas",
                "summary": "Criar Encomenda",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_encomendas_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_encomendas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_encomendas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "encomendas"
            }
        },
        "/r/encomendas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Encomendas"
                ],
                "operationId": "esquemaEncomendas",
                "summary": "Esquema de «Encomendas» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "encomendas"
            }
        },
        "/r/encomendas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Encomendas"
                ],
                "operationId": "obterEncomendas",
                "summary": "Obter Encomenda",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_encomendas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "encomendas"
            },
            "put": {
                "tags": [
                    "Recurso: Encomendas"
                ],
                "operationId": "alterarEncomendas",
                "summary": "Alterar Encomenda",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_encomendas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_encomendas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "encomendas"
            },
            "delete": {
                "tags": [
                    "Recurso: Encomendas"
                ],
                "operationId": "apagarEncomendas",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "encomendas"
            }
        },
        "/r/encomendas/{id}/acao/cancelar": {
            "post": {
                "tags": [
                    "Recurso: Encomendas"
                ],
                "operationId": "acaoCancelarEncomendas",
                "summary": "Ação: Cancelar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Motivo",
                                        "maxLength": 255
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "encomendas"
            }
        },
        "/r/encomendas/{id}/acao/enviar": {
            "post": {
                "tags": [
                    "Recurso: Encomendas"
                ],
                "operationId": "acaoEnviarEncomendas",
                "summary": "Ação: Enviar ao fornecedor",
                "description": "Nível exigido: editar. Enviar a encomenda ao fornecedor?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "encomendas"
            }
        },
        "/r/encomendas/{id}/acao/receber": {
            "post": {
                "tags": [
                    "Recurso: Encomendas"
                ],
                "operationId": "acaoReceberEncomendas",
                "summary": "Ação: Receber",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "lote": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Lote",
                                        "description": "Para artigos com lote obrigatório.",
                                        "maxLength": 60
                                    },
                                    "validade": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date",
                                        "title": "Validade"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "encomendas"
            }
        },
        "/r/episodios": {
            "get": {
                "tags": [
                    "Recurso: Episódios"
                ],
                "operationId": "listarEpisodios",
                "summary": "Listar Episódios",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[procedimento_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Procedimento». Lista: a,b; intervalo: f[procedimento_id][de]= e f[procedimento_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tecnica]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Técnica». Lista: a,b; intervalo: f[tecnica][de]= e f[tecnica][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[area]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Área». Lista: a,b; intervalo: f[area][de]= e f[area][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[medico_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Médico responsável». Lista: a,b; intervalo: f[medico_id][de]= e f[medico_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[aberto_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Aberto em». Lista: a,b; intervalo: f[aberto_em][de]= e f[aberto_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_episodios"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "episodios"
            },
            "post": {
                "tags": [
                    "Recurso: Episódios"
                ],
                "operationId": "criarEpisodios",
                "summary": "Criar Episódio",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_episodios_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_episodios_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_episodios"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "episodios"
            }
        },
        "/r/episodios/esquema": {
            "get": {
                "tags": [
                    "Recurso: Episódios"
                ],
                "operationId": "esquemaEpisodios",
                "summary": "Esquema de «Episódios» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "episodios"
            }
        },
        "/r/episodios/{id}": {
            "get": {
                "tags": [
                    "Recurso: Episódios"
                ],
                "operationId": "obterEpisodios",
                "summary": "Obter Episódio",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_episodios"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "episodios"
            },
            "put": {
                "tags": [
                    "Recurso: Episódios"
                ],
                "operationId": "alterarEpisodios",
                "summary": "Alterar Episódio",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_episodios_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_episodios"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "episodios"
            },
            "delete": {
                "tags": [
                    "Recurso: Episódios"
                ],
                "operationId": "apagarEpisodios",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "episodios"
            }
        },
        "/r/episodios/{id}/acao/adicionar_equipa": {
            "post": {
                "tags": [
                    "Recurso: Episódios"
                ],
                "operationId": "acaoAdicionarEquipaEpisodios",
                "summary": "Ação: Adicionar à equipa",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "utilizador_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "title": "Profissional",
                                        "x-anagen-recurso": "utilizadores"
                                    },
                                    "papel": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Papel",
                                        "enum": [
                                            "medico",
                                            "cirurgiao",
                                            "enfermeiro",
                                            "tecnico",
                                            "assistente",
                                            "anestesista",
                                            "coordenador",
                                            "comercial",
                                            "outro"
                                        ],
                                        "x-enum-rotulos": {
                                            "medico": "Médico",
                                            "cirurgiao": "Cirurgião",
                                            "enfermeiro": "Enfermeiro",
                                            "tecnico": "Técnico",
                                            "assistente": "Assistente",
                                            "anestesista": "Anestesista",
                                            "coordenador": "Coordenador",
                                            "comercial": "Consultor comercial",
                                            "outro": "Outro"
                                        }
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "episodios"
            }
        },
        "/r/episodios/{id}/acao/mudar_estado": {
            "post": {
                "tags": [
                    "Recurso: Episódios"
                ],
                "operationId": "acaoMudarEstadoEpisodios",
                "summary": "Ação: Mudar estado",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "estado": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Estado",
                                        "enum": [
                                            "avaliacao",
                                            "plano",
                                            "proposta",
                                            "agendado",
                                            "pre_operatorio",
                                            "cirurgia",
                                            "pos_operatorio",
                                            "acompanhamento",
                                            "concluido",
                                            "cancelado"
                                        ],
                                        "x-enum-rotulos": {
                                            "avaliacao": "Avaliação",
                                            "plano": "Plano",
                                            "proposta": "Proposta",
                                            "agendado": "Agendado",
                                            "pre_operatorio": "Pré-operatório",
                                            "cirurgia": "Cirurgia",
                                            "pos_operatorio": "Pós-operatório",
                                            "acompanhamento": "Acompanhamento",
                                            "concluido": "Concluído",
                                            "cancelado": "Cancelado"
                                        }
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "episodios"
            }
        },
        "/r/episodios_equipa": {
            "get": {
                "tags": [
                    "Recurso: Equipa dos episódios"
                ],
                "operationId": "listarEpisodiosEquipa",
                "summary": "Listar Equipa dos episódios",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[episodio_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Episódio». Lista: a,b; intervalo: f[episodio_id][de]= e f[episodio_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[utilizador_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Profissional». Lista: a,b; intervalo: f[utilizador_id][de]= e f[utilizador_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[papel]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Papel». Lista: a,b; intervalo: f[papel][de]= e f[papel][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_episodios_equipa"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "episodios_equipa"
            },
            "post": {
                "tags": [
                    "Recurso: Equipa dos episódios"
                ],
                "operationId": "criarEpisodiosEquipa",
                "summary": "Criar Participação na equipa",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_episodios_equipa_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_episodios_equipa_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_episodios_equipa"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "episodios_equipa"
            }
        },
        "/r/episodios_equipa/esquema": {
            "get": {
                "tags": [
                    "Recurso: Equipa dos episódios"
                ],
                "operationId": "esquemaEpisodiosEquipa",
                "summary": "Esquema de «Equipa dos episódios» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "episodios_equipa"
            }
        },
        "/r/episodios_equipa/{id}": {
            "get": {
                "tags": [
                    "Recurso: Equipa dos episódios"
                ],
                "operationId": "obterEpisodiosEquipa",
                "summary": "Obter Participação na equipa",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_episodios_equipa"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "episodios_equipa"
            },
            "put": {
                "tags": [
                    "Recurso: Equipa dos episódios"
                ],
                "operationId": "alterarEpisodiosEquipa",
                "summary": "Alterar Participação na equipa",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_episodios_equipa_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_episodios_equipa"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "episodios_equipa"
            },
            "delete": {
                "tags": [
                    "Recurso: Equipa dos episódios"
                ],
                "operationId": "apagarEpisodiosEquipa",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "episodios_equipa"
            }
        },
        "/r/episodios_equipa/{id}/acao/terminar": {
            "post": {
                "tags": [
                    "Recurso: Equipa dos episódios"
                ],
                "operationId": "acaoTerminarEpisodiosEquipa",
                "summary": "Ação: Terminar participação",
                "description": "Nível exigido: editar. Terminar esta participação? O acesso à ficha clínica cessa de imediato.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "episodios_equipa"
            }
        },
        "/r/equipamentos": {
            "get": {
                "tags": [
                    "Recurso: Equipamentos"
                ],
                "operationId": "listarEquipamentos",
                "summary": "Listar Equipamentos",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[dispositivo_medico]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Dispositivo médico». Lista: a,b; intervalo: f[dispositivo_medico][de]= e f[dispositivo_medico][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[classe]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Classe». Lista: a,b; intervalo: f[classe][de]= e f[classe][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[localizacao]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Localização». Lista: a,b; intervalo: f[localizacao][de]= e f[localizacao][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[proxima_manutencao]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Próxima manutenção». Lista: a,b; intervalo: f[proxima_manutencao][de]= e f[proxima_manutencao][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_equipamentos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "equipamentos"
            },
            "post": {
                "tags": [
                    "Recurso: Equipamentos"
                ],
                "operationId": "criarEquipamentos",
                "summary": "Criar Equipamento",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_equipamentos_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_equipamentos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_equipamentos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "equipamentos"
            }
        },
        "/r/equipamentos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Equipamentos"
                ],
                "operationId": "esquemaEquipamentos",
                "summary": "Esquema de «Equipamentos» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "equipamentos"
            }
        },
        "/r/equipamentos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Equipamentos"
                ],
                "operationId": "obterEquipamentos",
                "summary": "Obter Equipamento",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_equipamentos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "equipamentos"
            },
            "put": {
                "tags": [
                    "Recurso: Equipamentos"
                ],
                "operationId": "alterarEquipamentos",
                "summary": "Alterar Equipamento",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_equipamentos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_equipamentos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "equipamentos"
            },
            "delete": {
                "tags": [
                    "Recurso: Equipamentos"
                ],
                "operationId": "apagarEquipamentos",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "equipamentos"
            }
        },
        "/r/equipamentos/{id}/acao/registar_manutencao": {
            "post": {
                "tags": [
                    "Recurso: Equipamentos"
                ],
                "operationId": "acaoRegistarManutencaoEquipamentos",
                "summary": "Ação: Registar manutenção",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "equipamentos"
            }
        },
        "/r/equipamentos_registos": {
            "get": {
                "tags": [
                    "Recurso: Manutenções e registos"
                ],
                "operationId": "listarEquipamentosRegistos",
                "summary": "Listar Manutenções e registos",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[equipamento_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Equipamento». Lista: a,b; intervalo: f[equipamento_id][de]= e f[equipamento_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[data]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Data». Lista: a,b; intervalo: f[data][de]= e f[data][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_equipamentos_registos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "equipamentos_registos"
            },
            "post": {
                "tags": [
                    "Recurso: Manutenções e registos"
                ],
                "operationId": "criarEquipamentosRegistos",
                "summary": "Criar Registo de equipamento",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_equipamentos_registos_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_equipamentos_registos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_equipamentos_registos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "equipamentos_registos"
            }
        },
        "/r/equipamentos_registos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Manutenções e registos"
                ],
                "operationId": "esquemaEquipamentosRegistos",
                "summary": "Esquema de «Manutenções e registos» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "equipamentos_registos"
            }
        },
        "/r/equipamentos_registos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Manutenções e registos"
                ],
                "operationId": "obterEquipamentosRegistos",
                "summary": "Obter Registo de equipamento",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_equipamentos_registos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "equipamentos_registos"
            },
            "put": {
                "tags": [
                    "Recurso: Manutenções e registos"
                ],
                "operationId": "alterarEquipamentosRegistos",
                "summary": "Alterar Registo de equipamento",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_equipamentos_registos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_equipamentos_registos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "equipamentos_registos"
            },
            "delete": {
                "tags": [
                    "Recurso: Manutenções e registos"
                ],
                "operationId": "apagarEquipamentosRegistos",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "equipamentos_registos"
            }
        },
        "/r/equipas": {
            "get": {
                "tags": [
                    "Recurso: Equipas"
                ],
                "operationId": "listarEquipas",
                "summary": "Listar Equipas",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[departamento]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Departamento». Lista: a,b; intervalo: f[departamento][de]= e f[departamento][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[chefe_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Chefe de equipa». Lista: a,b; intervalo: f[chefe_id][de]= e f[chefe_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_equipas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "equipas"
            },
            "post": {
                "tags": [
                    "Recurso: Equipas"
                ],
                "operationId": "criarEquipas",
                "summary": "Criar Equipa",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_equipas_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_equipas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_equipas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "equipas"
            }
        },
        "/r/equipas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Equipas"
                ],
                "operationId": "esquemaEquipas",
                "summary": "Esquema de «Equipas» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "equipas"
            }
        },
        "/r/equipas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Equipas"
                ],
                "operationId": "obterEquipas",
                "summary": "Obter Equipa",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_equipas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "equipas"
            },
            "put": {
                "tags": [
                    "Recurso: Equipas"
                ],
                "operationId": "alterarEquipas",
                "summary": "Alterar Equipa",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_equipas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_equipas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "equipas"
            },
            "delete": {
                "tags": [
                    "Recurso: Equipas"
                ],
                "operationId": "apagarEquipas",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "equipas"
            }
        },
        "/r/feriados": {
            "get": {
                "tags": [
                    "Recurso: Feriados"
                ],
                "operationId": "listarFeriados",
                "summary": "Listar Feriados",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[data]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Data». Lista: a,b; intervalo: f[data][de]= e f[data][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ambito]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Âmbito». Lista: a,b; intervalo: f[ambito][de]= e f[ambito][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_feriados"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "feriados"
            },
            "post": {
                "tags": [
                    "Recurso: Feriados"
                ],
                "operationId": "criarFeriados",
                "summary": "Criar Feriado",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_feriados_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_feriados_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_feriados"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "feriados"
            }
        },
        "/r/feriados/esquema": {
            "get": {
                "tags": [
                    "Recurso: Feriados"
                ],
                "operationId": "esquemaFeriados",
                "summary": "Esquema de «Feriados» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "feriados"
            }
        },
        "/r/feriados/{id}": {
            "get": {
                "tags": [
                    "Recurso: Feriados"
                ],
                "operationId": "obterFeriados",
                "summary": "Obter Feriado",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_feriados"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "feriados"
            },
            "put": {
                "tags": [
                    "Recurso: Feriados"
                ],
                "operationId": "alterarFeriados",
                "summary": "Alterar Feriado",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_feriados_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_feriados"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "feriados"
            },
            "delete": {
                "tags": [
                    "Recurso: Feriados"
                ],
                "operationId": "apagarFeriados",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "feriados"
            }
        },
        "/r/formacoes": {
            "get": {
                "tags": [
                    "Recurso: Formação da equipa"
                ],
                "operationId": "listarFormacoes",
                "summary": "Listar Formação da equipa",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[utilizador_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Pessoa». Lista: a,b; intervalo: f[utilizador_id][de]= e f[utilizador_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tema]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tema». Lista: a,b; intervalo: f[tema][de]= e f[tema][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[data]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Data». Lista: a,b; intervalo: f[data][de]= e f[data][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[validade_ate]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Válida até». Lista: a,b; intervalo: f[validade_ate][de]= e f[validade_ate][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_formacoes"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "formacoes"
            },
            "post": {
                "tags": [
                    "Recurso: Formação da equipa"
                ],
                "operationId": "criarFormacoes",
                "summary": "Criar Formação",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_formacoes_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_formacoes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_formacoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "formacoes"
            }
        },
        "/r/formacoes/esquema": {
            "get": {
                "tags": [
                    "Recurso: Formação da equipa"
                ],
                "operationId": "esquemaFormacoes",
                "summary": "Esquema de «Formação da equipa» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "formacoes"
            }
        },
        "/r/formacoes/{id}": {
            "get": {
                "tags": [
                    "Recurso: Formação da equipa"
                ],
                "operationId": "obterFormacoes",
                "summary": "Obter Formação",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_formacoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "formacoes"
            },
            "put": {
                "tags": [
                    "Recurso: Formação da equipa"
                ],
                "operationId": "alterarFormacoes",
                "summary": "Alterar Formação",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_formacoes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_formacoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "formacoes"
            },
            "delete": {
                "tags": [
                    "Recurso: Formação da equipa"
                ],
                "operationId": "apagarFormacoes",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "formacoes"
            }
        },
        "/r/formularios": {
            "get": {
                "tags": [
                    "Recurso: Formulários"
                ],
                "operationId": "listarFormularios",
                "summary": "Listar Formulários",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tecnica]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Técnica». Lista: a,b; intervalo: f[tecnica][de]= e f[tecnica][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[idioma]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Idioma». Lista: a,b; intervalo: f[idioma][de]= e f[idioma][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativo». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[modelo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Modelo da biblioteca». Lista: a,b; intervalo: f[modelo][de]= e f[modelo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_formularios"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "formularios"
            },
            "post": {
                "tags": [
                    "Recurso: Formulários"
                ],
                "operationId": "criarFormularios",
                "summary": "Criar Formulário",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_formularios_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_formularios_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_formularios"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "formularios"
            }
        },
        "/r/formularios/esquema": {
            "get": {
                "tags": [
                    "Recurso: Formulários"
                ],
                "operationId": "esquemaFormularios",
                "summary": "Esquema de «Formulários» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "formularios"
            }
        },
        "/r/formularios/{id}": {
            "get": {
                "tags": [
                    "Recurso: Formulários"
                ],
                "operationId": "obterFormularios",
                "summary": "Obter Formulário",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_formularios"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "formularios"
            },
            "put": {
                "tags": [
                    "Recurso: Formulários"
                ],
                "operationId": "alterarFormularios",
                "summary": "Alterar Formulário",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_formularios_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_formularios"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "formularios"
            },
            "delete": {
                "tags": [
                    "Recurso: Formulários"
                ],
                "operationId": "apagarFormularios",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "formularios"
            }
        },
        "/r/formularios/{id}/acao/alternar": {
            "post": {
                "tags": [
                    "Recurso: Formulários"
                ],
                "operationId": "acaoAlternarFormularios",
                "summary": "Ação: Ativar / desativar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "formularios"
            }
        },
        "/r/formularios/{id}/acao/duplicar": {
            "post": {
                "tags": [
                    "Recurso: Formulários"
                ],
                "operationId": "acaoDuplicarFormularios",
                "summary": "Ação: Duplicar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "nome": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Nome",
                                        "maxLength": 160
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "formularios"
            }
        },
        "/r/formularios/{id}/acao/pedir": {
            "post": {
                "tags": [
                    "Recurso: Formulários"
                ],
                "operationId": "acaoPedirFormularios",
                "summary": "Ação: Pedir formulário",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "paciente_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "title": "Paciente",
                                        "x-anagen-recurso": "pacientes"
                                    },
                                    "canal": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Canal",
                                        "enum": [
                                            "email",
                                            "sms",
                                            "whatsapp",
                                            "ligacao"
                                        ],
                                        "x-enum-rotulos": {
                                            "email": "Email",
                                            "sms": "SMS",
                                            "whatsapp": "WhatsApp",
                                            "ligacao": "Só ligação (partilhar manualmente)"
                                        },
                                        "default": "email"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "formularios"
            }
        },
        "/r/formularios/{id}/acao/traduzir": {
            "post": {
                "tags": [
                    "Recurso: Formulários"
                ],
                "operationId": "acaoTraduzirFormularios",
                "summary": "Ação: Traduzir",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "idioma": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Idioma de destino",
                                        "enum": [
                                            "pt-PT",
                                            "pt-BR",
                                            "en",
                                            "es",
                                            "fr",
                                            "de"
                                        ],
                                        "x-enum-rotulos": {
                                            "pt-PT": "Português (Portugal)",
                                            "pt-BR": "Português (Brasil)",
                                            "en": "Inglês",
                                            "es": "Espanhol",
                                            "fr": "Francês",
                                            "de": "Alemão"
                                        }
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "formularios"
            }
        },
        "/r/formularios_respostas": {
            "get": {
                "tags": [
                    "Recurso: Respostas a formulários"
                ],
                "operationId": "listarFormulariosRespostas",
                "summary": "Listar Respostas a formulários",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão. Cada leitura fica na auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[formulario_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Formulário». Lista: a,b; intervalo: f[formulario_id][de]= e f[formulario_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[episodio_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Episódio». Lista: a,b; intervalo: f[episodio_id][de]= e f[episodio_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[origem]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Origem». Lista: a,b; intervalo: f[origem][de]= e f[origem][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[alarme]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Sinal de alarme». Lista: a,b; intervalo: f[alarme][de]= e f[alarme][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[canal]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Canal». Lista: a,b; intervalo: f[canal][de]= e f[canal][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[preenchido_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Preenchido em». Lista: a,b; intervalo: f[preenchido_em][de]= e f[preenchido_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_formularios_respostas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "formularios_respostas"
            }
        },
        "/r/formularios_respostas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Respostas a formulários"
                ],
                "operationId": "esquemaFormulariosRespostas",
                "summary": "Esquema de «Respostas a formulários» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "formularios_respostas"
            }
        },
        "/r/formularios_respostas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Respostas a formulários"
                ],
                "operationId": "obterFormulariosRespostas",
                "summary": "Obter Resposta a formulário",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_formularios_respostas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "formularios_respostas"
            }
        },
        "/r/formularios_respostas/{id}/acao/devolver": {
            "post": {
                "tags": [
                    "Recurso: Respostas a formulários"
                ],
                "operationId": "acaoDevolverFormulariosRespostas",
                "summary": "Ação: Devolver ao paciente",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "pedido": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Pedido de informação",
                                        "description": "Texto que o paciente vê ao reabrir o formulário. Indique com clareza o que falta.",
                                        "maxLength": 2000
                                    },
                                    "canal": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Canal",
                                        "enum": [
                                            "email",
                                            "sms",
                                            "whatsapp",
                                            "ligacao"
                                        ],
                                        "x-enum-rotulos": {
                                            "email": "Email",
                                            "sms": "SMS",
                                            "whatsapp": "WhatsApp",
                                            "ligacao": "Só ligação (partilhar manualmente)"
                                        },
                                        "default": "email"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "formularios_respostas"
            }
        },
        "/r/formularios_respostas/{id}/acao/rejeitar": {
            "post": {
                "tags": [
                    "Recurso: Respostas a formulários"
                ],
                "operationId": "acaoRejeitarFormulariosRespostas",
                "summary": "Ação: Rejeitar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Motivo",
                                        "maxLength": 400
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "formularios_respostas"
            }
        },
        "/r/formularios_respostas/{id}/acao/validar": {
            "post": {
                "tags": [
                    "Recurso: Respostas a formulários"
                ],
                "operationId": "acaoValidarFormulariosRespostas",
                "summary": "Ação: Validar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "formularios_respostas"
            }
        },
        "/r/fotos": {
            "get": {
                "tags": [
                    "Recurso: Fotografias"
                ],
                "operationId": "listarFotos",
                "summary": "Listar Fotografias",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão. Cada leitura fica na auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[data]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Data». Lista: a,b; intervalo: f[data][de]= e f[data][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[vista]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Vista». Lista: a,b; intervalo: f[vista][de]= e f[vista][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[zona]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Zona». Lista: a,b; intervalo: f[zona][de]= e f[zona][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[album]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Álbum». Lista: a,b; intervalo: f[album][de]= e f[album][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[origem]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Origem». Lista: a,b; intervalo: f[origem][de]= e f[origem][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[partilhada_paciente]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Partilhada com o paciente». Lista: a,b; intervalo: f[partilhada_paciente][de]= e f[partilhada_paciente][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[qualidade_ok]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Qualidade suficiente». Lista: a,b; intervalo: f[qualidade_ok][de]= e f[qualidade_ok][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[rosto_desfocado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Rosto desfocado». Lista: a,b; intervalo: f[rosto_desfocado][de]= e f[rosto_desfocado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[simulacao]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Simulação». Lista: a,b; intervalo: f[simulacao][de]= e f[simulacao][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_fotos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "fotos"
            },
            "post": {
                "tags": [
                    "Recurso: Fotografias"
                ],
                "operationId": "criarFotos",
                "summary": "Criar Fotografia",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_fotos_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_fotos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_fotos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "fotos"
            }
        },
        "/r/fotos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Fotografias"
                ],
                "operationId": "esquemaFotos",
                "summary": "Esquema de «Fotografias» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "fotos"
            }
        },
        "/r/fotos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Fotografias"
                ],
                "operationId": "obterFotos",
                "summary": "Obter Fotografia",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_fotos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "fotos"
            },
            "put": {
                "tags": [
                    "Recurso: Fotografias"
                ],
                "operationId": "alterarFotos",
                "summary": "Alterar Fotografia",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_fotos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_fotos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "fotos"
            },
            "delete": {
                "tags": [
                    "Recurso: Fotografias"
                ],
                "operationId": "apagarFotos",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "fotos"
            }
        },
        "/r/fotos/{id}/acao/aceitar": {
            "post": {
                "tags": [
                    "Recurso: Fotografias"
                ],
                "operationId": "acaoAceitarFotos",
                "summary": "Ação: Aceitar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "fotos"
            }
        },
        "/r/fotos/{id}/acao/deixar_partilhar": {
            "post": {
                "tags": [
                    "Recurso: Fotografias"
                ],
                "operationId": "acaoDeixarPartilharFotos",
                "summary": "Ação: Deixar de partilhar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "fotos"
            }
        },
        "/r/fotos/{id}/acao/partilhar": {
            "post": {
                "tags": [
                    "Recurso: Fotografias"
                ],
                "operationId": "acaoPartilharFotos",
                "summary": "Ação: Partilhar com o paciente",
                "description": "Nível exigido: editar. Partilhar esta fotografia com o paciente no portal?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "fotos"
            }
        },
        "/r/fotos/{id}/acao/rejeitar": {
            "post": {
                "tags": [
                    "Recurso: Fotografias"
                ],
                "operationId": "acaoRejeitarFotos",
                "summary": "Ação: Rejeitar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.fotografias:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "resposta": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Resposta ao paciente",
                                        "description": "Visível para o paciente no portal. Sem pormenores clínicos.",
                                        "maxLength": 1000
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "fotos"
            }
        },
        "/r/funil_fases": {
            "get": {
                "tags": [
                    "Recurso: Fases do funil"
                ],
                "operationId": "listarFunilFases",
                "summary": "Listar Fases do funil",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[funil_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Funil». Lista: a,b; intervalo: f[funil_id][de]= e f[funil_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativa]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativa». Lista: a,b; intervalo: f[ativa][de]= e f[ativa][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_funil_fases"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "funil_fases"
            },
            "post": {
                "tags": [
                    "Recurso: Fases do funil"
                ],
                "operationId": "criarFunilFases",
                "summary": "Criar Fase do funil",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_funil_fases_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_funil_fases_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_funil_fases"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "funil_fases"
            }
        },
        "/r/funil_fases/esquema": {
            "get": {
                "tags": [
                    "Recurso: Fases do funil"
                ],
                "operationId": "esquemaFunilFases",
                "summary": "Esquema de «Fases do funil» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "funil_fases"
            }
        },
        "/r/funil_fases/{id}": {
            "get": {
                "tags": [
                    "Recurso: Fases do funil"
                ],
                "operationId": "obterFunilFases",
                "summary": "Obter Fase do funil",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_funil_fases"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "funil_fases"
            },
            "put": {
                "tags": [
                    "Recurso: Fases do funil"
                ],
                "operationId": "alterarFunilFases",
                "summary": "Alterar Fase do funil",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_funil_fases_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_funil_fases"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "funil_fases"
            },
            "delete": {
                "tags": [
                    "Recurso: Fases do funil"
                ],
                "operationId": "apagarFunilFases",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "funil_fases"
            }
        },
        "/r/funis": {
            "get": {
                "tags": [
                    "Recurso: Funis por mercado"
                ],
                "operationId": "listarFunis",
                "summary": "Listar Funis por mercado",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativo». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_funis"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "funis"
            },
            "post": {
                "tags": [
                    "Recurso: Funis por mercado"
                ],
                "operationId": "criarFunis",
                "summary": "Criar Funil",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_funis_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_funis_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_funis"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "funis"
            }
        },
        "/r/funis/esquema": {
            "get": {
                "tags": [
                    "Recurso: Funis por mercado"
                ],
                "operationId": "esquemaFunis",
                "summary": "Esquema de «Funis por mercado» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "funis"
            }
        },
        "/r/funis/{id}": {
            "get": {
                "tags": [
                    "Recurso: Funis por mercado"
                ],
                "operationId": "obterFunis",
                "summary": "Obter Funil",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_funis"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "funis"
            },
            "put": {
                "tags": [
                    "Recurso: Funis por mercado"
                ],
                "operationId": "alterarFunis",
                "summary": "Alterar Funil",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_funis_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_funis"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "funis"
            },
            "delete": {
                "tags": [
                    "Recurso: Funis por mercado"
                ],
                "operationId": "apagarFunis",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "funis"
            }
        },
        "/r/funis/{id}/acao/criar_fases": {
            "post": {
                "tags": [
                    "Recurso: Funis por mercado"
                ],
                "operationId": "acaoCriarFasesFunis",
                "summary": "Ação: Criar fases a partir do principal",
                "description": "Nível exigido: editar. Copiar as fases do funil principal para este funil?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "funis"
            }
        },
        "/r/guioes": {
            "get": {
                "tags": [
                    "Recurso: Guiões"
                ],
                "operationId": "listarGuioes",
                "summary": "Listar Guiões",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[finalidade]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Finalidade». Lista: a,b; intervalo: f[finalidade][de]= e f[finalidade][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativo». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_guioes"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "guioes"
            },
            "post": {
                "tags": [
                    "Recurso: Guiões"
                ],
                "operationId": "criarGuioes",
                "summary": "Criar Guião",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_guioes_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_guioes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_guioes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "guioes"
            }
        },
        "/r/guioes/esquema": {
            "get": {
                "tags": [
                    "Recurso: Guiões"
                ],
                "operationId": "esquemaGuioes",
                "summary": "Esquema de «Guiões» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "guioes"
            }
        },
        "/r/guioes/{id}": {
            "get": {
                "tags": [
                    "Recurso: Guiões"
                ],
                "operationId": "obterGuioes",
                "summary": "Obter Guião",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_guioes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "guioes"
            },
            "put": {
                "tags": [
                    "Recurso: Guiões"
                ],
                "operationId": "alterarGuioes",
                "summary": "Alterar Guião",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_guioes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_guioes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "guioes"
            },
            "delete": {
                "tags": [
                    "Recurso: Guiões"
                ],
                "operationId": "apagarGuioes",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "guioes"
            }
        },
        "/r/honorarios": {
            "get": {
                "tags": [
                    "Recurso: Honorários"
                ],
                "operationId": "listarHonorarios",
                "summary": "Listar Honorários",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[utilizador_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Médico». Lista: a,b; intervalo: f[utilizador_id][de]= e f[utilizador_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[data_ato]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Data do ato». Lista: a,b; intervalo: f[data_ato][de]= e f[data_ato][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[cirurgia_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Cirurgia». Lista: a,b; intervalo: f[cirurgia_id][de]= e f[cirurgia_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_honorarios"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "honorarios"
            },
            "post": {
                "tags": [
                    "Recurso: Honorários"
                ],
                "operationId": "criarHonorarios",
                "summary": "Criar Honorário",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_honorarios_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_honorarios_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_honorarios"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "honorarios"
            }
        },
        "/r/honorarios/esquema": {
            "get": {
                "tags": [
                    "Recurso: Honorários"
                ],
                "operationId": "esquemaHonorarios",
                "summary": "Esquema de «Honorários» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "honorarios"
            }
        },
        "/r/honorarios/{id}": {
            "get": {
                "tags": [
                    "Recurso: Honorários"
                ],
                "operationId": "obterHonorarios",
                "summary": "Obter Honorário",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_honorarios"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "honorarios"
            },
            "put": {
                "tags": [
                    "Recurso: Honorários"
                ],
                "operationId": "alterarHonorarios",
                "summary": "Alterar Honorário",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_honorarios_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_honorarios"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "honorarios"
            }
        },
        "/r/honorarios/{id}/acao/marcar_pago": {
            "post": {
                "tags": [
                    "Recurso: Honorários"
                ],
                "operationId": "acaoMarcarPagoHonorarios",
                "summary": "Ação: Marcar como pago",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.valores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "referencia": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Referência do pagamento",
                                        "maxLength": 80
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "honorarios"
            }
        },
        "/r/horarios": {
            "get": {
                "tags": [
                    "Recurso: Horários"
                ],
                "operationId": "listarHorarios",
                "summary": "Listar Horários",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[utilizador_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Profissional». Lista: a,b; intervalo: f[utilizador_id][de]= e f[utilizador_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[recurso_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Sala ou recurso». Lista: a,b; intervalo: f[recurso_id][de]= e f[recurso_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[dia_semana]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Dia da semana». Lista: a,b; intervalo: f[dia_semana][de]= e f[dia_semana][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_horarios"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "horarios"
            },
            "post": {
                "tags": [
                    "Recurso: Horários"
                ],
                "operationId": "criarHorarios",
                "summary": "Criar Horário",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_horarios_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_horarios_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_horarios"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "horarios"
            }
        },
        "/r/horarios/esquema": {
            "get": {
                "tags": [
                    "Recurso: Horários"
                ],
                "operationId": "esquemaHorarios",
                "summary": "Esquema de «Horários» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "horarios"
            }
        },
        "/r/horarios/{id}": {
            "get": {
                "tags": [
                    "Recurso: Horários"
                ],
                "operationId": "obterHorarios",
                "summary": "Obter Horário",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_horarios"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "horarios"
            },
            "put": {
                "tags": [
                    "Recurso: Horários"
                ],
                "operationId": "alterarHorarios",
                "summary": "Alterar Horário",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_horarios_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_horarios"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "horarios"
            },
            "delete": {
                "tags": [
                    "Recurso: Horários"
                ],
                "operationId": "apagarHorarios",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "horarios"
            }
        },
        "/r/ia_pedidos": {
            "get": {
                "tags": [
                    "Recurso: Pedidos de IA"
                ],
                "operationId": "listarIaPedidos",
                "summary": "Listar Pedidos de IA",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[tarefa]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Uso». Lista: a,b; intervalo: f[tarefa][de]= e f[tarefa][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[fornecedor]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Serviço». Lista: a,b; intervalo: f[fornecedor][de]= e f[fornecedor][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[utilizador_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Pedido por». Lista: a,b; intervalo: f[utilizador_id][de]= e f[utilizador_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_ia_pedidos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "ia_pedidos"
            }
        },
        "/r/ia_pedidos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Pedidos de IA"
                ],
                "operationId": "esquemaIaPedidos",
                "summary": "Esquema de «Pedidos de IA» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "ia_pedidos"
            }
        },
        "/r/ia_pedidos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Pedidos de IA"
                ],
                "operationId": "obterIaPedidos",
                "summary": "Obter Pedido de IA",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_ia_pedidos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "ia_pedidos"
            }
        },
        "/r/ia_propostas": {
            "get": {
                "tags": [
                    "Recurso: Propostas da IA"
                ],
                "operationId": "listarIaPropostas",
                "summary": "Listar Propostas da IA",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão. Cada leitura fica na auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[consulta_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Consulta». Lista: a,b; intervalo: f[consulta_id][de]= e f[consulta_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[fornecedor]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Serviço». Lista: a,b; intervalo: f[fornecedor][de]= e f[fornecedor][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[modelo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Modelo». Lista: a,b; intervalo: f[modelo][de]= e f[modelo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[decidido_por]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Decidido por». Lista: a,b; intervalo: f[decidido_por][de]= e f[decidido_por][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[criado_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Criado em». Lista: a,b; intervalo: f[criado_em][de]= e f[criado_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_ia_propostas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "ia_propostas"
            }
        },
        "/r/ia_propostas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Propostas da IA"
                ],
                "operationId": "esquemaIaPropostas",
                "summary": "Esquema de «Propostas da IA» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "ia_propostas"
            }
        },
        "/r/ia_propostas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Propostas da IA"
                ],
                "operationId": "obterIaPropostas",
                "summary": "Obter Proposta da IA",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_ia_propostas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "ia_propostas"
            }
        },
        "/r/ia_propostas/{id}/acao/aceitar": {
            "post": {
                "tags": [
                    "Recurso: Propostas da IA"
                ],
                "operationId": "acaoAceitarIaPropostas",
                "summary": "Ação: Aceitar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "ia_propostas"
            }
        },
        "/r/ia_propostas/{id}/acao/corrigir": {
            "post": {
                "tags": [
                    "Recurso: Propostas da IA"
                ],
                "operationId": "acaoCorrigirIaPropostas",
                "summary": "Ação: Corrigir",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "valor_final": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Valor final",
                                        "maxLength": 20000
                                    },
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Motivo",
                                        "maxLength": 400
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "ia_propostas"
            }
        },
        "/r/ia_propostas/{id}/acao/recusar": {
            "post": {
                "tags": [
                    "Recurso: Propostas da IA"
                ],
                "operationId": "acaoRecusarIaPropostas",
                "summary": "Ação: Recusar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Motivo",
                                        "maxLength": 400
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "ia_propostas"
            }
        },
        "/r/imagens_marketing": {
            "get": {
                "tags": [
                    "Recurso: Biblioteca de imagens"
                ],
                "operationId": "listarImagensMarketing",
                "summary": "Listar Biblioteca de imagens",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[procedimento_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Procedimento». Lista: a,b; intervalo: f[procedimento_id][de]= e f[procedimento_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_imagens_marketing"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "imagens_marketing"
            },
            "post": {
                "tags": [
                    "Recurso: Biblioteca de imagens"
                ],
                "operationId": "criarImagensMarketing",
                "summary": "Criar Imagem",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_imagens_marketing_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_imagens_marketing_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_imagens_marketing"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "imagens_marketing"
            }
        },
        "/r/imagens_marketing/esquema": {
            "get": {
                "tags": [
                    "Recurso: Biblioteca de imagens"
                ],
                "operationId": "esquemaImagensMarketing",
                "summary": "Esquema de «Biblioteca de imagens» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "imagens_marketing"
            }
        },
        "/r/imagens_marketing/{id}": {
            "get": {
                "tags": [
                    "Recurso: Biblioteca de imagens"
                ],
                "operationId": "obterImagensMarketing",
                "summary": "Obter Imagem",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_imagens_marketing"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "imagens_marketing"
            },
            "put": {
                "tags": [
                    "Recurso: Biblioteca de imagens"
                ],
                "operationId": "alterarImagensMarketing",
                "summary": "Alterar Imagem",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_imagens_marketing_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_imagens_marketing"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "imagens_marketing"
            },
            "delete": {
                "tags": [
                    "Recurso: Biblioteca de imagens"
                ],
                "operationId": "apagarImagensMarketing",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "imagens_marketing"
            }
        },
        "/r/imagens_marketing/{id}/acao/retirar": {
            "post": {
                "tags": [
                    "Recurso: Biblioteca de imagens"
                ],
                "operationId": "acaoRetirarImagensMarketing",
                "summary": "Ação: Retirar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo_retirada": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Motivo da retirada",
                                        "maxLength": 255
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "imagens_marketing"
            }
        },
        "/r/importacoes": {
            "get": {
                "tags": [
                    "Recurso: Importações"
                ],
                "operationId": "listarImportacoes",
                "summary": "Listar Importações",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_importacoes"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "importacoes"
            }
        },
        "/r/importacoes/esquema": {
            "get": {
                "tags": [
                    "Recurso: Importações"
                ],
                "operationId": "esquemaImportacoes",
                "summary": "Esquema de «Importações» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "importacoes"
            }
        },
        "/r/importacoes/{id}": {
            "get": {
                "tags": [
                    "Recurso: Importações"
                ],
                "operationId": "obterImportacoes",
                "summary": "Obter Importação",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_importacoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "importacoes"
            }
        },
        "/r/incidentes_seguranca": {
            "get": {
                "tags": [
                    "Recurso: Incidentes de segurança"
                ],
                "operationId": "listarIncidentesSeguranca",
                "summary": "Listar Incidentes de segurança",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[gravidade]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Gravidade». Lista: a,b; intervalo: f[gravidade][de]= e f[gravidade][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[risco]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Risco para os titulares». Lista: a,b; intervalo: f[risco][de]= e f[risco][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[detetado_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Detetado em». Lista: a,b; intervalo: f[detetado_em][de]= e f[detetado_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[responsavel_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Responsável». Lista: a,b; intervalo: f[responsavel_id][de]= e f[responsavel_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_incidentes_seguranca"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "incidentes_seguranca"
            },
            "post": {
                "tags": [
                    "Recurso: Incidentes de segurança"
                ],
                "operationId": "criarIncidentesSeguranca",
                "summary": "Criar Incidente",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_incidentes_seguranca_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_incidentes_seguranca_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_incidentes_seguranca"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "incidentes_seguranca"
            }
        },
        "/r/incidentes_seguranca/esquema": {
            "get": {
                "tags": [
                    "Recurso: Incidentes de segurança"
                ],
                "operationId": "esquemaIncidentesSeguranca",
                "summary": "Esquema de «Incidentes de segurança» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "incidentes_seguranca"
            }
        },
        "/r/incidentes_seguranca/{id}": {
            "get": {
                "tags": [
                    "Recurso: Incidentes de segurança"
                ],
                "operationId": "obterIncidentesSeguranca",
                "summary": "Obter Incidente",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_incidentes_seguranca"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "incidentes_seguranca"
            },
            "put": {
                "tags": [
                    "Recurso: Incidentes de segurança"
                ],
                "operationId": "alterarIncidentesSeguranca",
                "summary": "Alterar Incidente",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_incidentes_seguranca_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_incidentes_seguranca"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "incidentes_seguranca"
            },
            "delete": {
                "tags": [
                    "Recurso: Incidentes de segurança"
                ],
                "operationId": "apagarIncidentesSeguranca",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "incidentes_seguranca"
            }
        },
        "/r/incidentes_seguranca/{id}/acao/encerrar": {
            "post": {
                "tags": [
                    "Recurso: Incidentes de segurança"
                ],
                "operationId": "acaoEncerrarIncidentesSeguranca",
                "summary": "Ação: Encerrar",
                "description": "Nível exigido: editar. Encerrar este incidente? Confirme que as medidas estão registadas.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "incidentes_seguranca"
            }
        },
        "/r/incidentes_seguranca/{id}/acao/notificar_cnpd": {
            "post": {
                "tags": [
                    "Recurso: Incidentes de segurança"
                ],
                "operationId": "acaoNotificarCnpdIncidentesSeguranca",
                "summary": "Ação: Registar notificação à CNPD",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "cnpd_referencia": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Referência da CNPD",
                                        "maxLength": 60
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "incidentes_seguranca"
            }
        },
        "/r/incidentes_seguranca/{id}/acao/notificar_titulares": {
            "post": {
                "tags": [
                    "Recurso: Incidentes de segurança"
                ],
                "operationId": "acaoNotificarTitularesIncidentesSeguranca",
                "summary": "Ação: Registar informação aos titulares",
                "description": "Nível exigido: editar. Confirmar que os titulares afetados foram informados?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "incidentes_seguranca"
            }
        },
        "/r/itinerarios": {
            "get": {
                "tags": [
                    "Recurso: Itinerários"
                ],
                "operationId": "listarItinerarios",
                "summary": "Listar Itinerários",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[chegada]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Chegada». Lista: a,b; intervalo: f[chegada][de]= e f[chegada][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[interprete_idioma]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Idioma do intérprete». Lista: a,b; intervalo: f[interprete_idioma][de]= e f[interprete_idioma][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_itinerarios"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "itinerarios"
            },
            "post": {
                "tags": [
                    "Recurso: Itinerários"
                ],
                "operationId": "criarItinerarios",
                "summary": "Criar Itinerário",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_itinerarios_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_itinerarios_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_itinerarios"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "itinerarios"
            }
        },
        "/r/itinerarios/esquema": {
            "get": {
                "tags": [
                    "Recurso: Itinerários"
                ],
                "operationId": "esquemaItinerarios",
                "summary": "Esquema de «Itinerários» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "itinerarios"
            }
        },
        "/r/itinerarios/{id}": {
            "get": {
                "tags": [
                    "Recurso: Itinerários"
                ],
                "operationId": "obterItinerarios",
                "summary": "Obter Itinerário",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_itinerarios"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "itinerarios"
            },
            "put": {
                "tags": [
                    "Recurso: Itinerários"
                ],
                "operationId": "alterarItinerarios",
                "summary": "Alterar Itinerário",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_itinerarios_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_itinerarios"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "itinerarios"
            },
            "delete": {
                "tags": [
                    "Recurso: Itinerários"
                ],
                "operationId": "apagarItinerarios",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "itinerarios"
            }
        },
        "/r/leads": {
            "get": {
                "tags": [
                    "Recurso: Leads"
                ],
                "operationId": "listarLeads",
                "summary": "Listar Leads",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[idioma]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Língua». Lista: a,b; intervalo: f[idioma][de]= e f[idioma][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[procedimento_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Procedimento de interesse». Lista: a,b; intervalo: f[procedimento_id][de]= e f[procedimento_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[origem]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Origem». Lista: a,b; intervalo: f[origem][de]= e f[origem][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[campanha]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Campanha». Lista: a,b; intervalo: f[campanha][de]= e f[campanha][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[funil_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Funil». Lista: a,b; intervalo: f[funil_id][de]= e f[funil_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[fase_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Fase». Lista: a,b; intervalo: f[fase_id][de]= e f[fase_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[responsavel_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Responsável». Lista: a,b; intervalo: f[responsavel_id][de]= e f[responsavel_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[decisao]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Decisão». Lista: a,b; intervalo: f[decisao][de]= e f[decisao][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[motivo_perda]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Motivo de perda». Lista: a,b; intervalo: f[motivo_perda][de]= e f[motivo_perda][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[duplicado_de]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Possível duplicado de». Lista: a,b; intervalo: f[duplicado_de][de]= e f[duplicado_de][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[criado_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Entrada». Lista: a,b; intervalo: f[criado_em][de]= e f[criado_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_leads"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "leads"
            },
            "post": {
                "tags": [
                    "Recurso: Leads"
                ],
                "operationId": "criarLeads",
                "summary": "Criar Lead",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_leads_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_leads_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_leads"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "leads"
            }
        },
        "/r/leads/esquema": {
            "get": {
                "tags": [
                    "Recurso: Leads"
                ],
                "operationId": "esquemaLeads",
                "summary": "Esquema de «Leads» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "leads"
            }
        },
        "/r/leads/{id}": {
            "get": {
                "tags": [
                    "Recurso: Leads"
                ],
                "operationId": "obterLeads",
                "summary": "Obter Lead",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_leads"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "leads"
            },
            "put": {
                "tags": [
                    "Recurso: Leads"
                ],
                "operationId": "alterarLeads",
                "summary": "Alterar Lead",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_leads_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_leads"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "leads"
            },
            "delete": {
                "tags": [
                    "Recurso: Leads"
                ],
                "operationId": "apagarLeads",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "leads"
            }
        },
        "/r/leads/{id}/acao/converter": {
            "post": {
                "tags": [
                    "Recurso: Leads"
                ],
                "operationId": "acaoConverterLeads",
                "summary": "Ação: Converter em paciente",
                "description": "Nível exigido: editar. Criar o paciente e abrir o episódio a partir deste lead?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "leads"
            }
        },
        "/r/leads/{id}/acao/fundir": {
            "post": {
                "tags": [
                    "Recurso: Leads"
                ],
                "operationId": "acaoFundirLeads",
                "summary": "Ação: Fundir com…",
                "description": "Nível exigido: editar. O lead escolhido junta-se a este (conversas, chamadas e tarefas incluídas). Continuar?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "duplicado_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "title": "Lead a juntar a este",
                                        "x-anagen-recurso": "leads"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "leads"
            }
        },
        "/r/leads/{id}/acao/marcar_perdido": {
            "post": {
                "tags": [
                    "Recurso: Leads"
                ],
                "operationId": "acaoMarcarPerdidoLeads",
                "summary": "Ação: Marcar como perdido",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo_perda": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Motivo de perda",
                                        "enum": [
                                            "preco",
                                            "prazo",
                                            "concorrencia",
                                            "nao_elegivel",
                                            "sem_resposta",
                                            "outro"
                                        ],
                                        "x-enum-rotulos": {
                                            "preco": "Preço",
                                            "prazo": "Prazo",
                                            "concorrencia": "Concorrência",
                                            "nao_elegivel": "Não elegível",
                                            "sem_resposta": "Sem resposta",
                                            "outro": "Outro"
                                        }
                                    },
                                    "motivo_perda_detalhe": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Pormenor do motivo",
                                        "maxLength": 255
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "leads"
            }
        },
        "/r/leads/{id}/acao/pedir_adesao": {
            "post": {
                "tags": [
                    "Recurso: Leads"
                ],
                "operationId": "acaoPedirAdesaoLeads",
                "summary": "Ação: Pedir adesão a comunicações",
                "description": "Nível exigido: editar. Enviar um email a pedir a confirmação da adesão a comunicações?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "leads"
            }
        },
        "/r/lista_espera": {
            "get": {
                "tags": [
                    "Recurso: Lista de espera"
                ],
                "operationId": "listarListaEspera",
                "summary": "Listar Lista de espera",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tipo_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo de marcação». Lista: a,b; intervalo: f[tipo_id][de]= e f[tipo_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[profissional_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Profissional preferido». Lista: a,b; intervalo: f[profissional_id][de]= e f[profissional_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[prioridade]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Prioridade». Lista: a,b; intervalo: f[prioridade][de]= e f[prioridade][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_lista_espera"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "lista_espera"
            },
            "post": {
                "tags": [
                    "Recurso: Lista de espera"
                ],
                "operationId": "criarListaEspera",
                "summary": "Criar Entrada na lista de espera",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_lista_espera_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_lista_espera_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_lista_espera"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "lista_espera"
            }
        },
        "/r/lista_espera/esquema": {
            "get": {
                "tags": [
                    "Recurso: Lista de espera"
                ],
                "operationId": "esquemaListaEspera",
                "summary": "Esquema de «Lista de espera» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "lista_espera"
            }
        },
        "/r/lista_espera/{id}": {
            "get": {
                "tags": [
                    "Recurso: Lista de espera"
                ],
                "operationId": "obterListaEspera",
                "summary": "Obter Entrada na lista de espera",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_lista_espera"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "lista_espera"
            },
            "put": {
                "tags": [
                    "Recurso: Lista de espera"
                ],
                "operationId": "alterarListaEspera",
                "summary": "Alterar Entrada na lista de espera",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_lista_espera_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_lista_espera"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "lista_espera"
            },
            "delete": {
                "tags": [
                    "Recurso: Lista de espera"
                ],
                "operationId": "apagarListaEspera",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "lista_espera"
            }
        },
        "/r/lista_espera/{id}/acao/marcar": {
            "post": {
                "tags": [
                    "Recurso: Lista de espera"
                ],
                "operationId": "acaoMarcarListaEspera",
                "summary": "Ação: Marcar numa vaga",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "lista_espera"
            }
        },
        "/r/lista_espera/{id}/acao/sair": {
            "post": {
                "tags": [
                    "Recurso: Lista de espera"
                ],
                "operationId": "acaoSairListaEspera",
                "summary": "Ação: Retirar da lista",
                "description": "Nível exigido: editar. Retirar este paciente da lista de espera?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "lista_espera"
            }
        },
        "/r/locais": {
            "get": {
                "tags": [
                    "Recurso: Locais"
                ],
                "operationId": "listarLocais",
                "summary": "Listar Locais",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[localidade]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Localidade». Lista: a,b; intervalo: f[localidade][de]= e f[localidade][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativo». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_locais"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "locais"
            },
            "post": {
                "tags": [
                    "Recurso: Locais"
                ],
                "operationId": "criarLocais",
                "summary": "Criar Local",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_locais_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_locais_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_locais"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "locais"
            }
        },
        "/r/locais/esquema": {
            "get": {
                "tags": [
                    "Recurso: Locais"
                ],
                "operationId": "esquemaLocais",
                "summary": "Esquema de «Locais» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "locais"
            }
        },
        "/r/locais/{id}": {
            "get": {
                "tags": [
                    "Recurso: Locais"
                ],
                "operationId": "obterLocais",
                "summary": "Obter Local",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_locais"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "locais"
            },
            "put": {
                "tags": [
                    "Recurso: Locais"
                ],
                "operationId": "alterarLocais",
                "summary": "Alterar Local",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_locais_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_locais"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "locais"
            },
            "delete": {
                "tags": [
                    "Recurso: Locais"
                ],
                "operationId": "apagarLocais",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "locais"
            }
        },
        "/r/marcacao_tipos": {
            "get": {
                "tags": [
                    "Recurso: Tipos de marcação"
                ],
                "operationId": "listarMarcacaoTipos",
                "summary": "Listar Tipos de marcação",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[teleconsulta]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Por vídeo (teleconsulta)». Lista: a,b; intervalo: f[teleconsulta][de]= e f[teleconsulta][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[cirurgia]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Bloco cirúrgico». Lista: a,b; intervalo: f[cirurgia][de]= e f[cirurgia][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[online]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Marcação online». Lista: a,b; intervalo: f[online][de]= e f[online][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativo». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_marcacao_tipos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "marcacao_tipos"
            },
            "post": {
                "tags": [
                    "Recurso: Tipos de marcação"
                ],
                "operationId": "criarMarcacaoTipos",
                "summary": "Criar Tipo de marcação",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_marcacao_tipos_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_marcacao_tipos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_marcacao_tipos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "marcacao_tipos"
            }
        },
        "/r/marcacao_tipos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Tipos de marcação"
                ],
                "operationId": "esquemaMarcacaoTipos",
                "summary": "Esquema de «Tipos de marcação» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "marcacao_tipos"
            }
        },
        "/r/marcacao_tipos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Tipos de marcação"
                ],
                "operationId": "obterMarcacaoTipos",
                "summary": "Obter Tipo de marcação",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_marcacao_tipos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "marcacao_tipos"
            },
            "put": {
                "tags": [
                    "Recurso: Tipos de marcação"
                ],
                "operationId": "alterarMarcacaoTipos",
                "summary": "Alterar Tipo de marcação",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_marcacao_tipos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_marcacao_tipos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "marcacao_tipos"
            },
            "delete": {
                "tags": [
                    "Recurso: Tipos de marcação"
                ],
                "operationId": "apagarMarcacaoTipos",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "marcacao_tipos"
            }
        },
        "/r/marcacoes": {
            "get": {
                "tags": [
                    "Recurso: Marcações"
                ],
                "operationId": "listarMarcacoes",
                "summary": "Listar Marcações",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[inicio]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Início». Lista: a,b; intervalo: f[inicio][de]= e f[inicio][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tipo_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo_id][de]= e f[tipo_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[profissional_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Profissional». Lista: a,b; intervalo: f[profissional_id][de]= e f[profissional_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[sala_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Sala». Lista: a,b; intervalo: f[sala_id][de]= e f[sala_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[origem]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Origem». Lista: a,b; intervalo: f[origem][de]= e f[origem][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_marcacoes"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "marcacoes"
            }
        },
        "/r/marcacoes/esquema": {
            "get": {
                "tags": [
                    "Recurso: Marcações"
                ],
                "operationId": "esquemaMarcacoes",
                "summary": "Esquema de «Marcações» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "marcacoes"
            }
        },
        "/r/marcacoes/{id}": {
            "get": {
                "tags": [
                    "Recurso: Marcações"
                ],
                "operationId": "obterMarcacoes",
                "summary": "Obter Marcação",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_marcacoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "marcacoes"
            }
        },
        "/r/marcacoes/{id}/acao/cancelar": {
            "post": {
                "tags": [
                    "Recurso: Marcações"
                ],
                "operationId": "acaoCancelarMarcacoes",
                "summary": "Ação: Cancelar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Motivo",
                                        "maxLength": 255
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "marcacoes"
            }
        },
        "/r/marcacoes/{id}/acao/chegou": {
            "post": {
                "tags": [
                    "Recurso: Marcações"
                ],
                "operationId": "acaoChegouMarcacoes",
                "summary": "Ação: Chegou",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "marcacoes"
            }
        },
        "/r/marcacoes/{id}/acao/concluir": {
            "post": {
                "tags": [
                    "Recurso: Marcações"
                ],
                "operationId": "acaoConcluirMarcacoes",
                "summary": "Ação: Concluir",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "marcacoes"
            }
        },
        "/r/marcacoes/{id}/acao/confirmar": {
            "post": {
                "tags": [
                    "Recurso: Marcações"
                ],
                "operationId": "acaoConfirmarMarcacoes",
                "summary": "Ação: Confirmar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "marcacoes"
            }
        },
        "/r/marcacoes/{id}/acao/faltou": {
            "post": {
                "tags": [
                    "Recurso: Marcações"
                ],
                "operationId": "acaoFaltouMarcacoes",
                "summary": "Ação: Faltou",
                "description": "Nível exigido: editar. Registar falta? Abre uma tarefa de recuperação para a receção.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "marcacoes"
            }
        },
        "/r/marcacoes/{id}/acao/lembrete": {
            "post": {
                "tags": [
                    "Recurso: Marcações"
                ],
                "operationId": "acaoLembreteMarcacoes",
                "summary": "Ação: Enviar lembrete",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "marcacoes"
            }
        },
        "/r/marcacoes/{id}/acao/remarcar": {
            "post": {
                "tags": [
                    "Recurso: Marcações"
                ],
                "operationId": "acaoRemarcarMarcacoes",
                "summary": "Ação: Remarcar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "inicio": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date-time",
                                        "title": "Nova data e hora"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "marcacoes"
            }
        },
        "/r/marcos_acompanhamento": {
            "get": {
                "tags": [
                    "Recurso: Marcos de acompanhamento"
                ],
                "operationId": "listarMarcosAcompanhamento",
                "summary": "Listar Marcos de acompanhamento",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão. Cada leitura fica na auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[marco]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Marco». Lista: a,b; intervalo: f[marco][de]= e f[marco][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[data_prevista]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Data prevista». Lista: a,b; intervalo: f[data_prevista][de]= e f[data_prevista][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_marcos_acompanhamento"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "marcos_acompanhamento"
            },
            "post": {
                "tags": [
                    "Recurso: Marcos de acompanhamento"
                ],
                "operationId": "criarMarcosAcompanhamento",
                "summary": "Criar Marco de acompanhamento",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_marcos_acompanhamento_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_marcos_acompanhamento_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_marcos_acompanhamento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "marcos_acompanhamento"
            }
        },
        "/r/marcos_acompanhamento/esquema": {
            "get": {
                "tags": [
                    "Recurso: Marcos de acompanhamento"
                ],
                "operationId": "esquemaMarcosAcompanhamento",
                "summary": "Esquema de «Marcos de acompanhamento» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "marcos_acompanhamento"
            }
        },
        "/r/marcos_acompanhamento/{id}": {
            "get": {
                "tags": [
                    "Recurso: Marcos de acompanhamento"
                ],
                "operationId": "obterMarcosAcompanhamento",
                "summary": "Obter Marco de acompanhamento",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_marcos_acompanhamento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "marcos_acompanhamento"
            },
            "put": {
                "tags": [
                    "Recurso: Marcos de acompanhamento"
                ],
                "operationId": "alterarMarcosAcompanhamento",
                "summary": "Alterar Marco de acompanhamento",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_marcos_acompanhamento_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_marcos_acompanhamento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "marcos_acompanhamento"
            },
            "delete": {
                "tags": [
                    "Recurso: Marcos de acompanhamento"
                ],
                "operationId": "apagarMarcosAcompanhamento",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "marcos_acompanhamento"
            }
        },
        "/r/marcos_acompanhamento/{id}/acao/concluir": {
            "post": {
                "tags": [
                    "Recurso: Marcos de acompanhamento"
                ],
                "operationId": "acaoConcluirMarcosAcompanhamento",
                "summary": "Ação: Concluir",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "marcos_acompanhamento"
            }
        },
        "/r/marcos_acompanhamento/{id}/acao/pedir_fotos": {
            "post": {
                "tags": [
                    "Recurso: Marcos de acompanhamento"
                ],
                "operationId": "acaoPedirFotosMarcosAcompanhamento",
                "summary": "Ação: Pedir fotografias",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "marcos_acompanhamento"
            }
        },
        "/r/marcos_acompanhamento/{id}/acao/recuperacao": {
            "post": {
                "tags": [
                    "Recurso: Marcos de acompanhamento"
                ],
                "operationId": "acaoRecuperacaoMarcosAcompanhamento",
                "summary": "Ação: Tarefa de recuperação",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "nota": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Nota para a receção",
                                        "description": "Sem pormenores clínicos.",
                                        "maxLength": 500
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "marcos_acompanhamento"
            }
        },
        "/r/modelos3d": {
            "get": {
                "tags": [
                    "Recurso: Modelos 3D"
                ],
                "operationId": "listarModelos3d",
                "summary": "Listar Modelos 3D",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão. Cada leitura fica na auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[formato]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Formato». Lista: a,b; intervalo: f[formato][de]= e f[formato][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[escala_confirmada]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Escala confirmada». Lista: a,b; intervalo: f[escala_confirmada][de]= e f[escala_confirmada][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[qualidade]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Qualidade». Lista: a,b; intervalo: f[qualidade][de]= e f[qualidade][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_modelos3d"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "modelos3d"
            },
            "post": {
                "tags": [
                    "Recurso: Modelos 3D"
                ],
                "operationId": "criarModelos3d",
                "summary": "Criar Modelo 3D",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_modelos3d_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_modelos3d_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_modelos3d"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "modelos3d"
            }
        },
        "/r/modelos3d/esquema": {
            "get": {
                "tags": [
                    "Recurso: Modelos 3D"
                ],
                "operationId": "esquemaModelos3d",
                "summary": "Esquema de «Modelos 3D» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "modelos3d"
            }
        },
        "/r/modelos3d/{id}": {
            "get": {
                "tags": [
                    "Recurso: Modelos 3D"
                ],
                "operationId": "obterModelos3d",
                "summary": "Obter Modelo 3D",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_modelos3d"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "modelos3d"
            },
            "put": {
                "tags": [
                    "Recurso: Modelos 3D"
                ],
                "operationId": "alterarModelos3d",
                "summary": "Alterar Modelo 3D",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_modelos3d_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_modelos3d"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "modelos3d"
            },
            "delete": {
                "tags": [
                    "Recurso: Modelos 3D"
                ],
                "operationId": "apagarModelos3d",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "modelos3d"
            }
        },
        "/r/motor_versoes": {
            "get": {
                "tags": [
                    "Recurso: Versões do motor"
                ],
                "operationId": "listarMotorVersoes",
                "summary": "Listar Versões do motor",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_motor_versoes"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "motor_versoes"
            }
        },
        "/r/motor_versoes/esquema": {
            "get": {
                "tags": [
                    "Recurso: Versões do motor"
                ],
                "operationId": "esquemaMotorVersoes",
                "summary": "Esquema de «Versões do motor» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "motor_versoes"
            }
        },
        "/r/motor_versoes/{id}": {
            "get": {
                "tags": [
                    "Recurso: Versões do motor"
                ],
                "operationId": "obterMotorVersoes",
                "summary": "Obter Versão do motor",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_motor_versoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "motor_versoes"
            },
            "delete": {
                "tags": [
                    "Recurso: Versões do motor"
                ],
                "operationId": "apagarMotorVersoes",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "motor_versoes"
            }
        },
        "/r/motor_versoes/{id}/acao/aprovar": {
            "post": {
                "tags": [
                    "Recurso: Versões do motor"
                ],
                "operationId": "acaoAprovarMotorVersoes",
                "summary": "Ação: Aprovar",
                "description": "Nível exigido: aprovar. Aprovar esta versão? A versão em vigor anterior fica arquivada.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "aprovar",
                "x-anagen-recurso": "motor_versoes"
            }
        },
        "/r/motor_versoes/{id}/acao/arquivar": {
            "post": {
                "tags": [
                    "Recurso: Versões do motor"
                ],
                "operationId": "acaoArquivarMotorVersoes",
                "summary": "Ação: Arquivar",
                "description": "Nível exigido: editar. Arquivar esta versão?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "motor_versoes"
            }
        },
        "/r/motor_versoes/{id}/acao/novo_rascunho": {
            "post": {
                "tags": [
                    "Recurso: Versões do motor"
                ],
                "operationId": "acaoNovoRascunhoMotorVersoes",
                "summary": "Ação: Novo rascunho a partir desta",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "motor_versoes"
            }
        },
        "/r/objetivos_comerciais": {
            "get": {
                "tags": [
                    "Recurso: Objetivos comerciais"
                ],
                "operationId": "listarObjetivosComerciais",
                "summary": "Listar Objetivos comerciais",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[periodo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Mês». Lista: a,b; intervalo: f[periodo][de]= e f[periodo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[utilizador_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Pessoa». Lista: a,b; intervalo: f[utilizador_id][de]= e f[utilizador_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[equipa_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Equipa». Lista: a,b; intervalo: f[equipa_id][de]= e f[equipa_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[metrica]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Métrica». Lista: a,b; intervalo: f[metrica][de]= e f[metrica][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_objetivos_comerciais"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "objetivos_comerciais"
            },
            "post": {
                "tags": [
                    "Recurso: Objetivos comerciais"
                ],
                "operationId": "criarObjetivosComerciais",
                "summary": "Criar Objetivo comercial",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_objetivos_comerciais_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_objetivos_comerciais_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_objetivos_comerciais"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "objetivos_comerciais"
            }
        },
        "/r/objetivos_comerciais/esquema": {
            "get": {
                "tags": [
                    "Recurso: Objetivos comerciais"
                ],
                "operationId": "esquemaObjetivosComerciais",
                "summary": "Esquema de «Objetivos comerciais» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "objetivos_comerciais"
            }
        },
        "/r/objetivos_comerciais/{id}": {
            "get": {
                "tags": [
                    "Recurso: Objetivos comerciais"
                ],
                "operationId": "obterObjetivosComerciais",
                "summary": "Obter Objetivo comercial",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_objetivos_comerciais"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "objetivos_comerciais"
            },
            "put": {
                "tags": [
                    "Recurso: Objetivos comerciais"
                ],
                "operationId": "alterarObjetivosComerciais",
                "summary": "Alterar Objetivo comercial",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_objetivos_comerciais_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_objetivos_comerciais"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "objetivos_comerciais"
            },
            "delete": {
                "tags": [
                    "Recurso: Objetivos comerciais"
                ],
                "operationId": "apagarObjetivosComerciais",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "objetivos_comerciais"
            }
        },
        "/r/pacientes": {
            "get": {
                "tags": [
                    "Recurso: Pacientes"
                ],
                "operationId": "listarPacientes",
                "summary": "Listar Pacientes",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[sexo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Sexo». Lista: a,b; intervalo: f[sexo][de]= e f[sexo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[data_nascimento]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Data de nascimento». Lista: a,b; intervalo: f[data_nascimento][de]= e f[data_nascimento][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[localidade]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Localidade». Lista: a,b; intervalo: f[localidade][de]= e f[localidade][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[idioma]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Idioma». Lista: a,b; intervalo: f[idioma][de]= e f[idioma][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[medico_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Médico assistente». Lista: a,b; intervalo: f[medico_id][de]= e f[medico_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[responsavel_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Responsável». Lista: a,b; intervalo: f[responsavel_id][de]= e f[responsavel_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[origem]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Origem». Lista: a,b; intervalo: f[origem][de]= e f[origem][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[portal_ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Portal do paciente ativo». Lista: a,b; intervalo: f[portal_ativo][de]= e f[portal_ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[litigio]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Em litígio». Lista: a,b; intervalo: f[litigio][de]= e f[litigio][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_pacientes"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "pacientes"
            },
            "post": {
                "tags": [
                    "Recurso: Pacientes"
                ],
                "operationId": "criarPacientes",
                "summary": "Criar Paciente",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_pacientes_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_pacientes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_pacientes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pacientes"
            }
        },
        "/r/pacientes/esquema": {
            "get": {
                "tags": [
                    "Recurso: Pacientes"
                ],
                "operationId": "esquemaPacientes",
                "summary": "Esquema de «Pacientes» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "pacientes"
            }
        },
        "/r/pacientes/{id}": {
            "get": {
                "tags": [
                    "Recurso: Pacientes"
                ],
                "operationId": "obterPacientes",
                "summary": "Obter Paciente",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_pacientes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "pacientes"
            },
            "put": {
                "tags": [
                    "Recurso: Pacientes"
                ],
                "operationId": "alterarPacientes",
                "summary": "Alterar Paciente",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_pacientes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_pacientes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pacientes"
            }
        },
        "/r/pacientes/{id}/acao/abrir_episodio": {
            "post": {
                "tags": [
                    "Recurso: Pacientes"
                ],
                "operationId": "acaoAbrirEpisodioPacientes",
                "summary": "Ação: Abrir episódio",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "procedimento_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "title": "Procedimento",
                                        "x-anagen-recurso": "procedimentos"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pacientes"
            }
        },
        "/r/pacientes/{id}/acao/arquivar": {
            "post": {
                "tags": [
                    "Recurso: Pacientes"
                ],
                "operationId": "acaoArquivarPacientes",
                "summary": "Ação: Arquivar",
                "description": "Nível exigido: editar. Arquivar este paciente? A ficha continua consultável e pode ser reativada.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pacientes"
            }
        },
        "/r/pacientes/{id}/acao/nova_consulta": {
            "post": {
                "tags": [
                    "Recurso: Pacientes"
                ],
                "operationId": "acaoNovaConsultaPacientes",
                "summary": "Ação: Nova consulta",
                "description": "Nível exigido: ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "tipo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Tipo de consulta",
                                        "enum": [
                                            "primeira",
                                            "avaliacao",
                                            "controlo",
                                            "teleconsulta",
                                            "pre_operatoria"
                                        ],
                                        "x-enum-rotulos": {
                                            "primeira": "Primeira consulta",
                                            "avaliacao": "Avaliação",
                                            "controlo": "Controlo",
                                            "teleconsulta": "Teleconsulta",
                                            "pre_operatoria": "Pré-operatória"
                                        },
                                        "default": "primeira"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "ver",
                "x-anagen-recurso": "pacientes"
            }
        },
        "/r/pacientes/{id}/acao/pedir_formulario": {
            "post": {
                "tags": [
                    "Recurso: Pacientes"
                ],
                "operationId": "acaoPedirFormularioPacientes",
                "summary": "Ação: Pedir formulário",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "formulario_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "title": "Formulário",
                                        "x-anagen-recurso": "formularios"
                                    },
                                    "canal": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Canal",
                                        "enum": [
                                            "email",
                                            "sms",
                                            "whatsapp",
                                            "ligacao"
                                        ],
                                        "x-enum-rotulos": {
                                            "email": "Email",
                                            "sms": "SMS",
                                            "whatsapp": "WhatsApp",
                                            "ligacao": "Só ligação (partilhar manualmente)"
                                        },
                                        "default": "email"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pacientes"
            }
        },
        "/r/pacientes/{id}/acao/reativar": {
            "post": {
                "tags": [
                    "Recurso: Pacientes"
                ],
                "operationId": "acaoReativarPacientes",
                "summary": "Ação: Reativar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pacientes"
            }
        },
        "/r/pacientes_alertas": {
            "get": {
                "tags": [
                    "Recurso: Alertas clínicos"
                ],
                "operationId": "listarPacientesAlertas",
                "summary": "Listar Alertas clínicos",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão. Cada leitura fica na auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[gravidade]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Gravidade». Lista: a,b; intervalo: f[gravidade][de]= e f[gravidade][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativo». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[validado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Validado». Lista: a,b; intervalo: f[validado][de]= e f[validado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[origem]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Origem». Lista: a,b; intervalo: f[origem][de]= e f[origem][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_pacientes_alertas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "pacientes_alertas"
            },
            "post": {
                "tags": [
                    "Recurso: Alertas clínicos"
                ],
                "operationId": "criarPacientesAlertas",
                "summary": "Criar Alerta clínico",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_pacientes_alertas_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_pacientes_alertas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_pacientes_alertas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pacientes_alertas"
            }
        },
        "/r/pacientes_alertas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Alertas clínicos"
                ],
                "operationId": "esquemaPacientesAlertas",
                "summary": "Esquema de «Alertas clínicos» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "pacientes_alertas"
            }
        },
        "/r/pacientes_alertas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Alertas clínicos"
                ],
                "operationId": "obterPacientesAlertas",
                "summary": "Obter Alerta clínico",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_pacientes_alertas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "pacientes_alertas"
            },
            "put": {
                "tags": [
                    "Recurso: Alertas clínicos"
                ],
                "operationId": "alterarPacientesAlertas",
                "summary": "Alterar Alerta clínico",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_pacientes_alertas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_pacientes_alertas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pacientes_alertas"
            }
        },
        "/r/pacientes_alertas/{id}/acao/desativar": {
            "post": {
                "tags": [
                    "Recurso: Alertas clínicos"
                ],
                "operationId": "acaoDesativarPacientesAlertas",
                "summary": "Ação: Desativar",
                "description": "Nível exigido: editar. Desativar este alerta? Deixa de aparecer em destaque, mas fica no histórico.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pacientes_alertas"
            }
        },
        "/r/pacientes_alertas/{id}/acao/reativar": {
            "post": {
                "tags": [
                    "Recurso: Alertas clínicos"
                ],
                "operationId": "acaoReativarPacientesAlertas",
                "summary": "Ação: Reativar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pacientes_alertas"
            }
        },
        "/r/pacientes_alertas/{id}/acao/validar": {
            "post": {
                "tags": [
                    "Recurso: Alertas clínicos"
                ],
                "operationId": "acaoValidarPacientesAlertas",
                "summary": "Ação: Validar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.clinica:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pacientes_alertas"
            }
        },
        "/r/pagamentos": {
            "get": {
                "tags": [
                    "Recurso: Pagamentos"
                ],
                "operationId": "listarPagamentos",
                "summary": "Listar Pagamentos",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[metodo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Método». Lista: a,b; intervalo: f[metodo][de]= e f[metodo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[vence_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Vence em». Lista: a,b; intervalo: f[vence_em][de]= e f[vence_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[pago_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Pago em». Lista: a,b; intervalo: f[pago_em][de]= e f[pago_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[confirmacao]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Confirmação». Lista: a,b; intervalo: f[confirmacao][de]= e f[confirmacao][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[proposta_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Proposta». Lista: a,b; intervalo: f[proposta_id][de]= e f[proposta_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[episodio_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Episódio». Lista: a,b; intervalo: f[episodio_id][de]= e f[episodio_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[caixa_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Caixa». Lista: a,b; intervalo: f[caixa_id][de]= e f[caixa_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[local_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Local». Lista: a,b; intervalo: f[local_id][de]= e f[local_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[conta_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Conta pagadora». Lista: a,b; intervalo: f[conta_id][de]= e f[conta_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[convencao_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Convenção». Lista: a,b; intervalo: f[convencao_id][de]= e f[convencao_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[terminal_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Terminal». Lista: a,b; intervalo: f[terminal_id][de]= e f[terminal_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_pagamentos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "pagamentos"
            }
        },
        "/r/pagamentos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Pagamentos"
                ],
                "operationId": "esquemaPagamentos",
                "summary": "Esquema de «Pagamentos» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "pagamentos"
            }
        },
        "/r/pagamentos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Pagamentos"
                ],
                "operationId": "obterPagamentos",
                "summary": "Obter Pagamento",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_pagamentos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "pagamentos"
            },
            "put": {
                "tags": [
                    "Recurso: Pagamentos"
                ],
                "operationId": "alterarPagamentos",
                "summary": "Alterar Pagamento",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_pagamentos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_pagamentos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pagamentos"
            }
        },
        "/r/pagamentos/{id}/acao/cancelar": {
            "post": {
                "tags": [
                    "Recurso: Pagamentos"
                ],
                "operationId": "acaoCancelarPagamentos",
                "summary": "Ação: Cancelar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Motivo",
                                        "maxLength": 255
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pagamentos"
            }
        },
        "/r/pagamentos/{id}/acao/consultar_estado": {
            "post": {
                "tags": [
                    "Recurso: Pagamentos"
                ],
                "operationId": "acaoConsultarEstadoPagamentos",
                "summary": "Ação: Consultar estado",
                "description": "Nível exigido: ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "ver",
                "x-anagen-recurso": "pagamentos"
            }
        },
        "/r/pagamentos/{id}/acao/emitir_fatura": {
            "post": {
                "tags": [
                    "Recurso: Pagamentos"
                ],
                "operationId": "acaoEmitirFaturaPagamentos",
                "summary": "Ação: Emitir documento fiscal",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pagamentos"
            }
        },
        "/r/pagamentos/{id}/acao/marcar_pago": {
            "post": {
                "tags": [
                    "Recurso: Pagamentos"
                ],
                "operationId": "acaoMarcarPagoPagamentos",
                "summary": "Ação: Marcar como pago",
                "description": "Nível exigido: editar. Confirma que o valor foi recebido?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "metodo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Método",
                                        "enum": [
                                            "numerario",
                                            "cartao",
                                            "transferencia",
                                            "financiamento"
                                        ],
                                        "x-enum-rotulos": {
                                            "numerario": "Numerário",
                                            "cartao": "Cartão (terminal)",
                                            "transferencia": "Transferência bancária",
                                            "financiamento": "Financiamento"
                                        }
                                    },
                                    "notas": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Nota (comprovativo, terminal)",
                                        "maxLength": 255
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pagamentos"
            }
        },
        "/r/pagamentos/{id}/acao/reembolsar": {
            "post": {
                "tags": [
                    "Recurso: Pagamentos"
                ],
                "operationId": "acaoReembolsarPagamentos",
                "summary": "Ação: Reembolsar",
                "description": "Nível exigido: editar. Reembolsar este pagamento? É emitida nota de crédito e as comissões da proposta são estornadas.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Motivo",
                                        "maxLength": 255
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pagamentos"
            }
        },
        "/r/parceiros": {
            "get": {
                "tags": [
                    "Recurso: Parceiros"
                ],
                "operationId": "listarParceiros",
                "summary": "Listar Parceiros",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[responsavel_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Responsável na clínica». Lista: a,b; intervalo: f[responsavel_id][de]= e f[responsavel_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_parceiros"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "parceiros"
            }
        },
        "/r/parceiros/esquema": {
            "get": {
                "tags": [
                    "Recurso: Parceiros"
                ],
                "operationId": "esquemaParceiros",
                "summary": "Esquema de «Parceiros» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "parceiros"
            }
        },
        "/r/parceiros/{id}": {
            "get": {
                "tags": [
                    "Recurso: Parceiros"
                ],
                "operationId": "obterParceiros",
                "summary": "Obter Parceiro",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_parceiros"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "parceiros"
            },
            "put": {
                "tags": [
                    "Recurso: Parceiros"
                ],
                "operationId": "alterarParceiros",
                "summary": "Alterar Parceiro",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_parceiros_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_parceiros"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "parceiros"
            },
            "delete": {
                "tags": [
                    "Recurso: Parceiros"
                ],
                "operationId": "apagarParceiros",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "parceiros"
            }
        },
        "/r/parceiros/{id}/acao/aprovar": {
            "post": {
                "tags": [
                    "Recurso: Parceiros"
                ],
                "operationId": "acaoAprovarParceiros",
                "summary": "Ação: Aprovar",
                "description": "Nível exigido: editar. Aprovar esta conta de parceiro?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "parceiros"
            }
        },
        "/r/parceiros/{id}/acao/reativar": {
            "post": {
                "tags": [
                    "Recurso: Parceiros"
                ],
                "operationId": "acaoReativarParceiros",
                "summary": "Ação: Reativar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "parceiros"
            }
        },
        "/r/parceiros/{id}/acao/recusar": {
            "post": {
                "tags": [
                    "Recurso: Parceiros"
                ],
                "operationId": "acaoRecusarParceiros",
                "summary": "Ação: Recusar",
                "description": "Nível exigido: editar. Recusar este pedido de conta?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "parceiros"
            }
        },
        "/r/parceiros/{id}/acao/suspender": {
            "post": {
                "tags": [
                    "Recurso: Parceiros"
                ],
                "operationId": "acaoSuspenderParceiros",
                "summary": "Ação: Suspender",
                "description": "Nível exigido: editar. Suspender a conta e terminar as sessões?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "parceiros"
            }
        },
        "/r/parceiros/{id}/acao/terminar_sessoes": {
            "post": {
                "tags": [
                    "Recurso: Parceiros"
                ],
                "operationId": "acaoTerminarSessoesParceiros",
                "summary": "Ação: Terminar sessões",
                "description": "Nível exigido: editar. Terminar todas as sessões e acessos da app deste parceiro?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "parceiros"
            }
        },
        "/r/parceiros_encaminhamentos": {
            "get": {
                "tags": [
                    "Recurso: Encaminhamentos de parceiros"
                ],
                "operationId": "listarParceirosEncaminhamentos",
                "summary": "Listar Encaminhamentos de parceiros",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[parceiro_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Parceiro». Lista: a,b; intervalo: f[parceiro_id][de]= e f[parceiro_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado_manual]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado mostrado ao parceiro». Lista: a,b; intervalo: f[estado_manual][de]= e f[estado_manual][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[criado_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Recebido em». Lista: a,b; intervalo: f[criado_em][de]= e f[criado_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_parceiros_encaminhamentos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "parceiros_encaminhamentos"
            }
        },
        "/r/parceiros_encaminhamentos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Encaminhamentos de parceiros"
                ],
                "operationId": "esquemaParceirosEncaminhamentos",
                "summary": "Esquema de «Encaminhamentos de parceiros» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "parceiros_encaminhamentos"
            }
        },
        "/r/parceiros_encaminhamentos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Encaminhamentos de parceiros"
                ],
                "operationId": "obterParceirosEncaminhamentos",
                "summary": "Obter Encaminhamento",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_parceiros_encaminhamentos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "parceiros_encaminhamentos"
            },
            "put": {
                "tags": [
                    "Recurso: Encaminhamentos de parceiros"
                ],
                "operationId": "alterarParceirosEncaminhamentos",
                "summary": "Alterar Encaminhamento",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_parceiros_encaminhamentos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_parceiros_encaminhamentos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "parceiros_encaminhamentos"
            },
            "delete": {
                "tags": [
                    "Recurso: Encaminhamentos de parceiros"
                ],
                "operationId": "apagarParceirosEncaminhamentos",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "parceiros_encaminhamentos"
            }
        },
        "/r/parceiros_encaminhamentos/{id}/acao/registar_autorizacao": {
            "post": {
                "tags": [
                    "Recurso: Encaminhamentos de parceiros"
                ],
                "operationId": "acaoRegistarAutorizacaoParceirosEncaminhamentos",
                "summary": "Ação: Registar autorização do paciente",
                "description": "Nível exigido: editar. Confirma que o paciente autorizou, de forma expressa, partilhar a evolução com este parceiro?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "origem": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Como foi dada",
                                        "enum": [
                                            "presencial",
                                            "documento",
                                            "portal"
                                        ],
                                        "x-enum-rotulos": {
                                            "presencial": "Dada presencialmente",
                                            "documento": "Documento assinado",
                                            "portal": "No portal do paciente"
                                        },
                                        "default": "documento"
                                    },
                                    "valida_ate": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date",
                                        "title": "Válida até"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "parceiros_encaminhamentos"
            }
        },
        "/r/parceiros_encaminhamentos/{id}/acao/revogar_autorizacao": {
            "post": {
                "tags": [
                    "Recurso: Encaminhamentos de parceiros"
                ],
                "operationId": "acaoRevogarAutorizacaoParceirosEncaminhamentos",
                "summary": "Ação: Revogar autorização",
                "description": "Nível exigido: editar. Revogar a autorização? O parceiro deixa de ver a evolução.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Motivo",
                                        "maxLength": 255
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "parceiros_encaminhamentos"
            }
        },
        "/r/pedidos_titulares": {
            "get": {
                "tags": [
                    "Recurso: Pedidos dos titulares"
                ],
                "operationId": "listarPedidosTitulares",
                "summary": "Listar Pedidos dos titulares",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Pedido». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[canal]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Canal». Lista: a,b; intervalo: f[canal][de]= e f[canal][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[recebido_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Recebido em». Lista: a,b; intervalo: f[recebido_em][de]= e f[recebido_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[prazo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Prazo». Lista: a,b; intervalo: f[prazo][de]= e f[prazo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tratado_por]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tratado por». Lista: a,b; intervalo: f[tratado_por][de]= e f[tratado_por][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_pedidos_titulares"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "pedidos_titulares"
            },
            "post": {
                "tags": [
                    "Recurso: Pedidos dos titulares"
                ],
                "operationId": "criarPedidosTitulares",
                "summary": "Criar Pedido de titular",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_pedidos_titulares_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_pedidos_titulares_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_pedidos_titulares"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pedidos_titulares"
            }
        },
        "/r/pedidos_titulares/esquema": {
            "get": {
                "tags": [
                    "Recurso: Pedidos dos titulares"
                ],
                "operationId": "esquemaPedidosTitulares",
                "summary": "Esquema de «Pedidos dos titulares» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "pedidos_titulares"
            }
        },
        "/r/pedidos_titulares/{id}": {
            "get": {
                "tags": [
                    "Recurso: Pedidos dos titulares"
                ],
                "operationId": "obterPedidosTitulares",
                "summary": "Obter Pedido de titular",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_pedidos_titulares"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "pedidos_titulares"
            },
            "put": {
                "tags": [
                    "Recurso: Pedidos dos titulares"
                ],
                "operationId": "alterarPedidosTitulares",
                "summary": "Alterar Pedido de titular",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_pedidos_titulares_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_pedidos_titulares"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pedidos_titulares"
            },
            "delete": {
                "tags": [
                    "Recurso: Pedidos dos titulares"
                ],
                "operationId": "apagarPedidosTitulares",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pedidos_titulares"
            }
        },
        "/r/pedidos_titulares/{id}/acao/aplicar_apagamento": {
            "post": {
                "tags": [
                    "Recurso: Pedidos dos titulares"
                ],
                "operationId": "acaoAplicarApagamentoPedidosTitulares",
                "summary": "Ação: Aplicar apagamento",
                "description": "Nível exigido: editar. Aplicar o apagamento? São apagados ou anonimizados os dados sem obrigação de conservação; o processo clínico, a faturação, os consentimentos e a auditoria mantêm-se pelos prazos legais.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pedidos_titulares"
            }
        },
        "/r/pedidos_titulares/{id}/acao/em_analise": {
            "post": {
                "tags": [
                    "Recurso: Pedidos dos titulares"
                ],
                "operationId": "acaoEmAnalisePedidosTitulares",
                "summary": "Ação: Pôr em análise",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "identidade_verificada": {
                                        "type": [
                                            "boolean",
                                            "null"
                                        ],
                                        "title": "Identidade verificada"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pedidos_titulares"
            }
        },
        "/r/pedidos_titulares/{id}/acao/exportar_dados": {
            "post": {
                "tags": [
                    "Recurso: Pedidos dos titulares"
                ],
                "operationId": "acaoExportarDadosPedidosTitulares",
                "summary": "Ação: Exportar dados",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pedidos_titulares"
            }
        },
        "/r/pedidos_titulares/{id}/acao/prorrogar": {
            "post": {
                "tags": [
                    "Recurso: Pedidos dos titulares"
                ],
                "operationId": "acaoProrrogarPedidosTitulares",
                "summary": "Ação: Prorrogar prazo",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Motivo da prorrogação",
                                        "maxLength": 500
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pedidos_titulares"
            }
        },
        "/r/pedidos_titulares/{id}/acao/responder": {
            "post": {
                "tags": [
                    "Recurso: Pedidos dos titulares"
                ],
                "operationId": "acaoResponderPedidosTitulares",
                "summary": "Ação: Responder",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "estado": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Decisão",
                                        "enum": [
                                            "concluido",
                                            "recusado"
                                        ],
                                        "x-enum-rotulos": {
                                            "concluido": "Concluído",
                                            "recusado": "Recusado"
                                        }
                                    },
                                    "resposta": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Resposta",
                                        "maxLength": 10000
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pedidos_titulares"
            }
        },
        "/r/perfis": {
            "get": {
                "tags": [
                    "Recurso: Perfis"
                ],
                "operationId": "listarPerfis",
                "summary": "Listar Perfis",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[departamento]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Família». Lista: a,b; intervalo: f[departamento][de]= e f[departamento][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_perfis"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "perfis"
            }
        },
        "/r/perfis/esquema": {
            "get": {
                "tags": [
                    "Recurso: Perfis"
                ],
                "operationId": "esquemaPerfis",
                "summary": "Esquema de «Perfis» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "perfis"
            }
        },
        "/r/perfis/{id}": {
            "get": {
                "tags": [
                    "Recurso: Perfis"
                ],
                "operationId": "obterPerfis",
                "summary": "Obter Perfil",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_perfis"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "perfis"
            }
        },
        "/r/planos": {
            "get": {
                "tags": [
                    "Recurso: Planos cirúrgicos"
                ],
                "operationId": "listarPlanos",
                "summary": "Listar Planos cirúrgicos",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão. Cada leitura fica na auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tecnica]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Técnica». Lista: a,b; intervalo: f[tecnica][de]= e f[tecnica][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_planos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "planos"
            }
        },
        "/r/planos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Planos cirúrgicos"
                ],
                "operationId": "esquemaPlanos",
                "summary": "Esquema de «Planos cirúrgicos» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "planos"
            }
        },
        "/r/planos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Planos cirúrgicos"
                ],
                "operationId": "obterPlanos",
                "summary": "Obter Plano cirúrgico",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_planos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "planos"
            },
            "delete": {
                "tags": [
                    "Recurso: Planos cirúrgicos"
                ],
                "operationId": "apagarPlanos",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "planos"
            }
        },
        "/r/planos/{id}/acao/aprovar": {
            "post": {
                "tags": [
                    "Recurso: Planos cirúrgicos"
                ],
                "operationId": "acaoAprovarPlanos",
                "summary": "Ação: Aprovar",
                "description": "Nível exigido: aprovar. Aprovar o plano? É recalculado e selado com uma impressão digital.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "aprovar",
                "x-anagen-recurso": "planos"
            }
        },
        "/r/planos/{id}/acao/nova_versao": {
            "post": {
                "tags": [
                    "Recurso: Planos cirúrgicos"
                ],
                "operationId": "acaoNovaVersaoPlanos",
                "summary": "Ação: Nova versão",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "planos"
            }
        },
        "/r/planos/{id}/acao/submeter": {
            "post": {
                "tags": [
                    "Recurso: Planos cirúrgicos"
                ],
                "operationId": "acaoSubmeterPlanos",
                "summary": "Ação: Submeter para revisão",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "planos"
            }
        },
        "/r/portal_contas": {
            "get": {
                "tags": [
                    "Recurso: Contas do portal"
                ],
                "operationId": "listarPortalContas",
                "summary": "Listar Contas do portal",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_portal_contas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "portal_contas"
            },
            "post": {
                "tags": [
                    "Recurso: Contas do portal"
                ],
                "operationId": "criarPortalContas",
                "summary": "Criar Conta do portal",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_portal_contas_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_portal_contas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_portal_contas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "portal_contas"
            }
        },
        "/r/portal_contas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Contas do portal"
                ],
                "operationId": "esquemaPortalContas",
                "summary": "Esquema de «Contas do portal» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "portal_contas"
            }
        },
        "/r/portal_contas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Contas do portal"
                ],
                "operationId": "obterPortalContas",
                "summary": "Obter Conta do portal",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_portal_contas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "portal_contas"
            }
        },
        "/r/portal_contas/{id}/acao/reativar": {
            "post": {
                "tags": [
                    "Recurso: Contas do portal"
                ],
                "operationId": "acaoReativarPortalContas",
                "summary": "Ação: Reativar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "portal_contas"
            }
        },
        "/r/portal_contas/{id}/acao/suspender": {
            "post": {
                "tags": [
                    "Recurso: Contas do portal"
                ],
                "operationId": "acaoSuspenderPortalContas",
                "summary": "Ação: Suspender",
                "description": "Nível exigido: editar. Suspender a conta e terminar todas as sessões do paciente?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "portal_contas"
            }
        },
        "/r/portal_contas/{id}/acao/terminar": {
            "post": {
                "tags": [
                    "Recurso: Contas do portal"
                ],
                "operationId": "acaoTerminarPortalContas",
                "summary": "Ação: Terminar sessões",
                "description": "Nível exigido: editar. Terminar todas as sessões do paciente no portal e na aplicação?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "portal_contas"
            }
        },
        "/r/portal_pedidos": {
            "get": {
                "tags": [
                    "Recurso: Pedidos do portal"
                ],
                "operationId": "listarPortalPedidos",
                "summary": "Listar Pedidos do portal",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[canal]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Canal». Lista: a,b; intervalo: f[canal][de]= e f[canal][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[prazo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Prazo legal». Lista: a,b; intervalo: f[prazo][de]= e f[prazo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_portal_pedidos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "portal_pedidos"
            }
        },
        "/r/portal_pedidos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Pedidos do portal"
                ],
                "operationId": "esquemaPortalPedidos",
                "summary": "Esquema de «Pedidos do portal» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "portal_pedidos"
            }
        },
        "/r/portal_pedidos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Pedidos do portal"
                ],
                "operationId": "obterPortalPedidos",
                "summary": "Obter Pedido do portal",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_portal_pedidos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "portal_pedidos"
            }
        },
        "/r/portal_pedidos/{id}/acao/aceitar": {
            "post": {
                "tags": [
                    "Recurso: Pedidos do portal"
                ],
                "operationId": "acaoAceitarPortalPedidos",
                "summary": "Ação: Aceitar e aplicar",
                "description": "Nível exigido: editar. Aplicar as alterações à ficha do paciente?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "portal_pedidos"
            }
        },
        "/r/portal_pedidos/{id}/acao/analisar": {
            "post": {
                "tags": [
                    "Recurso: Pedidos do portal"
                ],
                "operationId": "acaoAnalisarPortalPedidos",
                "summary": "Ação: Marcar em análise",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "portal_pedidos"
            }
        },
        "/r/portal_pedidos/{id}/acao/concluir": {
            "post": {
                "tags": [
                    "Recurso: Pedidos do portal"
                ],
                "operationId": "acaoConcluirPortalPedidos",
                "summary": "Ação: Concluir e responder",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "resposta": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Resposta ao paciente",
                                        "maxLength": 5000
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "portal_pedidos"
            }
        },
        "/r/portal_pedidos/{id}/acao/recusar": {
            "post": {
                "tags": [
                    "Recurso: Pedidos do portal"
                ],
                "operationId": "acaoRecusarPortalPedidos",
                "summary": "Ação: Recusar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.identificacao:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Motivo",
                                        "maxLength": 2000
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "portal_pedidos"
            }
        },
        "/r/pre_avaliacoes": {
            "get": {
                "tags": [
                    "Recurso: Pré-avaliações"
                ],
                "operationId": "listarPreAvaliacoes",
                "summary": "Listar Pré-avaliações",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[procedimento]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Área de interesse». Lista: a,b; intervalo: f[procedimento][de]= e f[procedimento][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[idioma]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Língua». Lista: a,b; intervalo: f[idioma][de]= e f[idioma][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[origem]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Origem». Lista: a,b; intervalo: f[origem][de]= e f[origem][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[parecer]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Parecer médico». Lista: a,b; intervalo: f[parecer][de]= e f[parecer][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[criado_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Recebida em». Lista: a,b; intervalo: f[criado_em][de]= e f[criado_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_pre_avaliacoes"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "pre_avaliacoes"
            }
        },
        "/r/pre_avaliacoes/esquema": {
            "get": {
                "tags": [
                    "Recurso: Pré-avaliações"
                ],
                "operationId": "esquemaPreAvaliacoes",
                "summary": "Esquema de «Pré-avaliações» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "pre_avaliacoes"
            }
        },
        "/r/pre_avaliacoes/{id}": {
            "get": {
                "tags": [
                    "Recurso: Pré-avaliações"
                ],
                "operationId": "obterPreAvaliacoes",
                "summary": "Obter Pré-avaliação",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_pre_avaliacoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "pre_avaliacoes"
            }
        },
        "/r/pre_avaliacoes/{id}/acao/abrir_lead": {
            "post": {
                "tags": [
                    "Recurso: Pré-avaliações"
                ],
                "operationId": "acaoAbrirLeadPreAvaliacoes",
                "summary": "Ação: Abrir o lead",
                "description": "Nível exigido: ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "ver",
                "x-anagen-recurso": "pre_avaliacoes"
            }
        },
        "/r/pre_avaliacoes/{id}/acao/enviar_resposta": {
            "post": {
                "tags": [
                    "Recurso: Pré-avaliações"
                ],
                "operationId": "acaoEnviarRespostaPreAvaliacoes",
                "summary": "Ação: Enviar resposta",
                "description": "Nível exigido: editar. Enviar a resposta ao interessado?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "mensagem": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Mensagem adicional",
                                        "description": "Opcional. Sem pormenores clínicos.",
                                        "maxLength": 2000
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "pre_avaliacoes"
            }
        },
        "/r/pre_avaliacoes/{id}/acao/marcar_revista": {
            "post": {
                "tags": [
                    "Recurso: Pré-avaliações"
                ],
                "operationId": "acaoMarcarRevistaPreAvaliacoes",
                "summary": "Ação: Marcar como revista",
                "description": "Nível exigido: ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "parecer": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Parecer médico",
                                        "enum": [
                                            "consulta",
                                            "teleconsulta",
                                            "mais_fotos",
                                            "nao_elegivel",
                                            "outro"
                                        ],
                                        "x-enum-rotulos": {
                                            "consulta": "Marcar consulta presencial",
                                            "teleconsulta": "Marcar teleconsulta",
                                            "mais_fotos": "Pedir mais fotografias",
                                            "nao_elegivel": "Conversa sobre outras opções",
                                            "outro": "Outro (contacto da equipa)"
                                        }
                                    },
                                    "nota": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Nota médica (interna)",
                                        "maxLength": 4000
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "ver",
                "x-anagen-recurso": "pre_avaliacoes"
            }
        },
        "/r/pre_avaliacoes/{id}/acao/rever": {
            "post": {
                "tags": [
                    "Recurso: Pré-avaliações"
                ],
                "operationId": "acaoReverPreAvaliacoes",
                "summary": "Ação: Abrir revisão",
                "description": "Nível exigido: ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "ver",
                "x-anagen-recurso": "pre_avaliacoes"
            }
        },
        "/r/procedimentos": {
            "get": {
                "tags": [
                    "Recurso: Procedimentos"
                ],
                "operationId": "listarProcedimentos",
                "summary": "Listar Procedimentos",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tecnica]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Técnica». Lista: a,b; intervalo: f[tecnica][de]= e f[tecnica][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[area]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Área». Lista: a,b; intervalo: f[area][de]= e f[area][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[iva_validado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Validado pelo contabilista». Lista: a,b; intervalo: f[iva_validado][de]= e f[iva_validado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativo». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_procedimentos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "procedimentos"
            },
            "post": {
                "tags": [
                    "Recurso: Procedimentos"
                ],
                "operationId": "criarProcedimentos",
                "summary": "Criar Procedimento",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_procedimentos_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_procedimentos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_procedimentos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "procedimentos"
            }
        },
        "/r/procedimentos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Procedimentos"
                ],
                "operationId": "esquemaProcedimentos",
                "summary": "Esquema de «Procedimentos» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "procedimentos"
            }
        },
        "/r/procedimentos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Procedimentos"
                ],
                "operationId": "obterProcedimentos",
                "summary": "Obter Procedimento",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_procedimentos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "procedimentos"
            },
            "put": {
                "tags": [
                    "Recurso: Procedimentos"
                ],
                "operationId": "alterarProcedimentos",
                "summary": "Alterar Procedimento",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_procedimentos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_procedimentos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "procedimentos"
            },
            "delete": {
                "tags": [
                    "Recurso: Procedimentos"
                ],
                "operationId": "apagarProcedimentos",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "procedimentos"
            }
        },
        "/r/propostas": {
            "get": {
                "tags": [
                    "Recurso: Propostas"
                ],
                "operationId": "listarPropostas",
                "summary": "Listar Propostas",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[lead_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Contacto». Lista: a,b; intervalo: f[lead_id][de]= e f[lead_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[procedimento_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Procedimento». Lista: a,b; intervalo: f[procedimento_id][de]= e f[procedimento_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[moeda]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Moeda». Lista: a,b; intervalo: f[moeda][de]= e f[moeda][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[desconto_estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Desconto». Lista: a,b; intervalo: f[desconto_estado][de]= e f[desconto_estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[validade_ate]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Válida até». Lista: a,b; intervalo: f[validade_ate][de]= e f[validade_ate][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[enviada_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Enviada em». Lista: a,b; intervalo: f[enviada_em][de]= e f[enviada_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[aceite_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Aceite em». Lista: a,b; intervalo: f[aceite_em][de]= e f[aceite_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[responsavel_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Responsável». Lista: a,b; intervalo: f[responsavel_id][de]= e f[responsavel_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_propostas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "propostas"
            }
        },
        "/r/propostas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Propostas"
                ],
                "operationId": "esquemaPropostas",
                "summary": "Esquema de «Propostas» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "propostas"
            }
        },
        "/r/propostas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Propostas"
                ],
                "operationId": "obterPropostas",
                "summary": "Obter Proposta",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_propostas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "propostas"
            },
            "delete": {
                "tags": [
                    "Recurso: Propostas"
                ],
                "operationId": "apagarPropostas",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "comercial.propostas:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "propostas"
            }
        },
        "/r/protocolos_foto": {
            "get": {
                "tags": [
                    "Recurso: Protocolos fotográficos"
                ],
                "operationId": "listarProtocolosFoto",
                "summary": "Listar Protocolos fotográficos",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[marco]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Marco». Lista: a,b; intervalo: f[marco][de]= e f[marco][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativo». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_protocolos_foto"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "protocolos_foto"
            },
            "post": {
                "tags": [
                    "Recurso: Protocolos fotográficos"
                ],
                "operationId": "criarProtocolosFoto",
                "summary": "Criar Protocolo fotográfico",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_protocolos_foto_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_protocolos_foto_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_protocolos_foto"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "protocolos_foto"
            }
        },
        "/r/protocolos_foto/esquema": {
            "get": {
                "tags": [
                    "Recurso: Protocolos fotográficos"
                ],
                "operationId": "esquemaProtocolosFoto",
                "summary": "Esquema de «Protocolos fotográficos» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "protocolos_foto"
            }
        },
        "/r/protocolos_foto/{id}": {
            "get": {
                "tags": [
                    "Recurso: Protocolos fotográficos"
                ],
                "operationId": "obterProtocolosFoto",
                "summary": "Obter Protocolo fotográfico",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_protocolos_foto"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "protocolos_foto"
            },
            "put": {
                "tags": [
                    "Recurso: Protocolos fotográficos"
                ],
                "operationId": "alterarProtocolosFoto",
                "summary": "Alterar Protocolo fotográfico",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_protocolos_foto_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_protocolos_foto"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "protocolos_foto"
            },
            "delete": {
                "tags": [
                    "Recurso: Protocolos fotográficos"
                ],
                "operationId": "apagarProtocolosFoto",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "protocolos_foto"
            }
        },
        "/r/publicos_anuncios": {
            "get": {
                "tags": [
                    "Recurso: Públicos para anúncios"
                ],
                "operationId": "listarPublicosAnuncios",
                "summary": "Listar Públicos para anúncios",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[plataforma]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Destino». Lista: a,b; intervalo: f[plataforma][de]= e f[plataforma][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_publicos_anuncios"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "publicos_anuncios"
            },
            "post": {
                "tags": [
                    "Recurso: Públicos para anúncios"
                ],
                "operationId": "criarPublicosAnuncios",
                "summary": "Criar Público",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_publicos_anuncios_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_publicos_anuncios_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_publicos_anuncios"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "publicos_anuncios"
            }
        },
        "/r/publicos_anuncios/esquema": {
            "get": {
                "tags": [
                    "Recurso: Públicos para anúncios"
                ],
                "operationId": "esquemaPublicosAnuncios",
                "summary": "Esquema de «Públicos para anúncios» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "publicos_anuncios"
            }
        },
        "/r/publicos_anuncios/{id}": {
            "get": {
                "tags": [
                    "Recurso: Públicos para anúncios"
                ],
                "operationId": "obterPublicosAnuncios",
                "summary": "Obter Público",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_publicos_anuncios"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "publicos_anuncios"
            },
            "put": {
                "tags": [
                    "Recurso: Públicos para anúncios"
                ],
                "operationId": "alterarPublicosAnuncios",
                "summary": "Alterar Público",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_publicos_anuncios_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_publicos_anuncios"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "publicos_anuncios"
            },
            "delete": {
                "tags": [
                    "Recurso: Públicos para anúncios"
                ],
                "operationId": "apagarPublicosAnuncios",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "publicos_anuncios"
            }
        },
        "/r/publicos_anuncios/{id}/acao/enviar": {
            "post": {
                "tags": [
                    "Recurso: Públicos para anúncios"
                ],
                "operationId": "acaoEnviarPublicosAnuncios",
                "summary": "Ação: Enviar agora",
                "description": "Nível exigido: editar. Enviar este público à plataforma? Quem deixou de poder estar é retirado.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "publicos_anuncios"
            }
        },
        "/r/reclamacoes": {
            "get": {
                "tags": [
                    "Recurso: Reclamações, elogios e sugestões"
                ],
                "operationId": "listarReclamacoes",
                "summary": "Listar Reclamações, elogios e sugestões",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[canal]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Canal». Lista: a,b; intervalo: f[canal][de]= e f[canal][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[categoria]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Categoria». Lista: a,b; intervalo: f[categoria][de]= e f[categoria][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[recebida_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Recebida em». Lista: a,b; intervalo: f[recebida_em][de]= e f[recebida_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[prazo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Prazo». Lista: a,b; intervalo: f[prazo][de]= e f[prazo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[responsavel_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Responsável». Lista: a,b; intervalo: f[responsavel_id][de]= e f[responsavel_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[exportada_ers_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Exportada para a ERS em». Lista: a,b; intervalo: f[exportada_ers_em][de]= e f[exportada_ers_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_reclamacoes"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "reclamacoes"
            },
            "post": {
                "tags": [
                    "Recurso: Reclamações, elogios e sugestões"
                ],
                "operationId": "criarReclamacoes",
                "summary": "Criar Reclamação",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_reclamacoes_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_reclamacoes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_reclamacoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "reclamacoes"
            }
        },
        "/r/reclamacoes/esquema": {
            "get": {
                "tags": [
                    "Recurso: Reclamações, elogios e sugestões"
                ],
                "operationId": "esquemaReclamacoes",
                "summary": "Esquema de «Reclamações, elogios e sugestões» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "reclamacoes"
            }
        },
        "/r/reclamacoes/{id}": {
            "get": {
                "tags": [
                    "Recurso: Reclamações, elogios e sugestões"
                ],
                "operationId": "obterReclamacoes",
                "summary": "Obter Reclamação",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_reclamacoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "reclamacoes"
            },
            "put": {
                "tags": [
                    "Recurso: Reclamações, elogios e sugestões"
                ],
                "operationId": "alterarReclamacoes",
                "summary": "Alterar Reclamação",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_reclamacoes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_reclamacoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "reclamacoes"
            },
            "delete": {
                "tags": [
                    "Recurso: Reclamações, elogios e sugestões"
                ],
                "operationId": "apagarReclamacoes",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "reclamacoes"
            }
        },
        "/r/reclamacoes/{id}/acao/encerrar": {
            "post": {
                "tags": [
                    "Recurso: Reclamações, elogios e sugestões"
                ],
                "operationId": "acaoEncerrarReclamacoes",
                "summary": "Ação: Encerrar",
                "description": "Nível exigido: editar. Encerrar esta reclamação?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "reclamacoes"
            }
        },
        "/r/reclamacoes/{id}/acao/responder": {
            "post": {
                "tags": [
                    "Recurso: Reclamações, elogios e sugestões"
                ],
                "operationId": "acaoResponderReclamacoes",
                "summary": "Ação: Responder",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "resposta": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Resposta",
                                        "maxLength": 10000
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "reclamacoes"
            }
        },
        "/r/reclamacoes/{id}/acao/tratar": {
            "post": {
                "tags": [
                    "Recurso: Reclamações, elogios e sugestões"
                ],
                "operationId": "acaoTratarReclamacoes",
                "summary": "Ação: Começar tratamento",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "reclamacoes"
            }
        },
        "/r/recursos_agenda": {
            "get": {
                "tags": [
                    "Recurso: Salas, equipamentos e intérpretes"
                ],
                "operationId": "listarRecursosAgenda",
                "summary": "Listar Salas, equipamentos e intérpretes",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[idioma]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Idioma». Lista: a,b; intervalo: f[idioma][de]= e f[idioma][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[bloco]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Sala operatória». Lista: a,b; intervalo: f[bloco][de]= e f[bloco][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativo». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_recursos_agenda"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "recursos_agenda"
            },
            "post": {
                "tags": [
                    "Recurso: Salas, equipamentos e intérpretes"
                ],
                "operationId": "criarRecursosAgenda",
                "summary": "Criar Recurso da agenda",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_recursos_agenda_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_recursos_agenda_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_recursos_agenda"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "recursos_agenda"
            }
        },
        "/r/recursos_agenda/esquema": {
            "get": {
                "tags": [
                    "Recurso: Salas, equipamentos e intérpretes"
                ],
                "operationId": "esquemaRecursosAgenda",
                "summary": "Esquema de «Salas, equipamentos e intérpretes» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "recursos_agenda"
            }
        },
        "/r/recursos_agenda/{id}": {
            "get": {
                "tags": [
                    "Recurso: Salas, equipamentos e intérpretes"
                ],
                "operationId": "obterRecursosAgenda",
                "summary": "Obter Recurso da agenda",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_recursos_agenda"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "recursos_agenda"
            },
            "put": {
                "tags": [
                    "Recurso: Salas, equipamentos e intérpretes"
                ],
                "operationId": "alterarRecursosAgenda",
                "summary": "Alterar Recurso da agenda",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_recursos_agenda_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_recursos_agenda"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "recursos_agenda"
            },
            "delete": {
                "tags": [
                    "Recurso: Salas, equipamentos e intérpretes"
                ],
                "operationId": "apagarRecursosAgenda",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "agenda:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "recursos_agenda"
            }
        },
        "/r/regras_elegibilidade": {
            "get": {
                "tags": [
                    "Recurso: Regras de elegibilidade"
                ],
                "operationId": "listarRegrasElegibilidade",
                "summary": "Listar Regras de elegibilidade",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[nivel]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Nível». Lista: a,b; intervalo: f[nivel][de]= e f[nivel][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativa]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativa». Lista: a,b; intervalo: f[ativa][de]= e f[ativa][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_regras_elegibilidade"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "regras_elegibilidade"
            },
            "post": {
                "tags": [
                    "Recurso: Regras de elegibilidade"
                ],
                "operationId": "criarRegrasElegibilidade",
                "summary": "Criar Regra de elegibilidade",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_regras_elegibilidade_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_regras_elegibilidade_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_regras_elegibilidade"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "regras_elegibilidade"
            }
        },
        "/r/regras_elegibilidade/esquema": {
            "get": {
                "tags": [
                    "Recurso: Regras de elegibilidade"
                ],
                "operationId": "esquemaRegrasElegibilidade",
                "summary": "Esquema de «Regras de elegibilidade» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "regras_elegibilidade"
            }
        },
        "/r/regras_elegibilidade/{id}": {
            "get": {
                "tags": [
                    "Recurso: Regras de elegibilidade"
                ],
                "operationId": "obterRegrasElegibilidade",
                "summary": "Obter Regra de elegibilidade",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_regras_elegibilidade"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "regras_elegibilidade"
            },
            "put": {
                "tags": [
                    "Recurso: Regras de elegibilidade"
                ],
                "operationId": "alterarRegrasElegibilidade",
                "summary": "Alterar Regra de elegibilidade",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_regras_elegibilidade_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_regras_elegibilidade"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "regras_elegibilidade"
            },
            "delete": {
                "tags": [
                    "Recurso: Regras de elegibilidade"
                ],
                "operationId": "apagarRegrasElegibilidade",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "regras_elegibilidade"
            }
        },
        "/r/regras_elegibilidade/{id}/acao/alternar": {
            "post": {
                "tags": [
                    "Recurso: Regras de elegibilidade"
                ],
                "operationId": "acaoAlternarRegrasElegibilidade",
                "summary": "Ação: Ativar / desativar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "regras_elegibilidade"
            }
        },
        "/r/regras_elegibilidade/{id}/acao/aprovar": {
            "post": {
                "tags": [
                    "Recurso: Regras de elegibilidade"
                ],
                "operationId": "acaoAprovarRegrasElegibilidade",
                "summary": "Ação: Aprovar regra",
                "description": "Nível exigido: aprovar. Aprovar esta regra? Passa a ser avaliada em todas as consultas.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "aprovar",
                "x-anagen-recurso": "regras_elegibilidade"
            }
        },
        "/r/regras_elegibilidade/{id}/acao/arquivar": {
            "post": {
                "tags": [
                    "Recurso: Regras de elegibilidade"
                ],
                "operationId": "acaoArquivarRegrasElegibilidade",
                "summary": "Ação: Arquivar",
                "description": "Nível exigido: editar. Arquivar esta regra? Deixa de ser avaliada nas consultas.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "clinico.parametros:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "regras_elegibilidade"
            }
        },
        "/r/relatorios_agendados": {
            "get": {
                "tags": [
                    "Recurso: Relatórios agendados"
                ],
                "operationId": "listarRelatoriosAgendados",
                "summary": "Listar Relatórios agendados",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[periodicidade]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Periodicidade». Lista: a,b; intervalo: f[periodicidade][de]= e f[periodicidade][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativo». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_relatorios_agendados"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "relatorios_agendados"
            },
            "post": {
                "tags": [
                    "Recurso: Relatórios agendados"
                ],
                "operationId": "criarRelatoriosAgendados",
                "summary": "Criar Relatório agendado",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_relatorios_agendados_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_relatorios_agendados_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_relatorios_agendados"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "relatorios_agendados"
            }
        },
        "/r/relatorios_agendados/esquema": {
            "get": {
                "tags": [
                    "Recurso: Relatórios agendados"
                ],
                "operationId": "esquemaRelatoriosAgendados",
                "summary": "Esquema de «Relatórios agendados» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "relatorios_agendados"
            }
        },
        "/r/relatorios_agendados/{id}": {
            "get": {
                "tags": [
                    "Recurso: Relatórios agendados"
                ],
                "operationId": "obterRelatoriosAgendados",
                "summary": "Obter Relatório agendado",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_relatorios_agendados"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "relatorios_agendados"
            },
            "put": {
                "tags": [
                    "Recurso: Relatórios agendados"
                ],
                "operationId": "alterarRelatoriosAgendados",
                "summary": "Alterar Relatório agendado",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_relatorios_agendados_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_relatorios_agendados"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "relatorios_agendados"
            },
            "delete": {
                "tags": [
                    "Recurso: Relatórios agendados"
                ],
                "operationId": "apagarRelatoriosAgendados",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "relatorios_agendados"
            }
        },
        "/r/relatorios_agendados/{id}/acao/enviar_agora": {
            "post": {
                "tags": [
                    "Recurso: Relatórios agendados"
                ],
                "operationId": "acaoEnviarAgoraRelatoriosAgendados",
                "summary": "Ação: Enviar agora",
                "description": "Nível exigido: editar. Enviar já este relatório aos destinatários?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "relatorios_agendados"
            }
        },
        "/r/respostas_rapidas": {
            "get": {
                "tags": [
                    "Recurso: Respostas rápidas"
                ],
                "operationId": "listarRespostasRapidas",
                "summary": "Listar Respostas rápidas",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[canal]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Canal». Lista: a,b; intervalo: f[canal][de]= e f[canal][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[idioma]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Língua». Lista: a,b; intervalo: f[idioma][de]= e f[idioma][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_respostas_rapidas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "respostas_rapidas"
            },
            "post": {
                "tags": [
                    "Recurso: Respostas rápidas"
                ],
                "operationId": "criarRespostasRapidas",
                "summary": "Criar Resposta rápida",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_respostas_rapidas_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_respostas_rapidas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_respostas_rapidas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "respostas_rapidas"
            }
        },
        "/r/respostas_rapidas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Respostas rápidas"
                ],
                "operationId": "esquemaRespostasRapidas",
                "summary": "Esquema de «Respostas rápidas» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "respostas_rapidas"
            }
        },
        "/r/respostas_rapidas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Respostas rápidas"
                ],
                "operationId": "obterRespostasRapidas",
                "summary": "Obter Resposta rápida",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_respostas_rapidas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "respostas_rapidas"
            },
            "put": {
                "tags": [
                    "Recurso: Respostas rápidas"
                ],
                "operationId": "alterarRespostasRapidas",
                "summary": "Alterar Resposta rápida",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_respostas_rapidas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_respostas_rapidas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "respostas_rapidas"
            },
            "delete": {
                "tags": [
                    "Recurso: Respostas rápidas"
                ],
                "operationId": "apagarRespostasRapidas",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.atendimento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "respostas_rapidas"
            }
        },
        "/r/reunioes": {
            "get": {
                "tags": [
                    "Recurso: Reuniões"
                ],
                "operationId": "listarReunioes",
                "summary": "Listar Reuniões",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[inicio]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Início». Lista: a,b; intervalo: f[inicio][de]= e f[inicio][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_reunioes"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "reunioes"
            },
            "post": {
                "tags": [
                    "Recurso: Reuniões"
                ],
                "operationId": "criarReunioes",
                "summary": "Criar Reunião",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_reunioes_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_reunioes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_reunioes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "reunioes"
            }
        },
        "/r/reunioes/esquema": {
            "get": {
                "tags": [
                    "Recurso: Reuniões"
                ],
                "operationId": "esquemaReunioes",
                "summary": "Esquema de «Reuniões» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "reunioes"
            }
        },
        "/r/reunioes/{id}": {
            "get": {
                "tags": [
                    "Recurso: Reuniões"
                ],
                "operationId": "obterReunioes",
                "summary": "Obter Reunião",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_reunioes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "reunioes"
            },
            "put": {
                "tags": [
                    "Recurso: Reuniões"
                ],
                "operationId": "alterarReunioes",
                "summary": "Alterar Reunião",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_reunioes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_reunioes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "reunioes"
            },
            "delete": {
                "tags": [
                    "Recurso: Reuniões"
                ],
                "operationId": "apagarReunioes",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "reunioes"
            }
        },
        "/r/reunioes/{id}/acao/cancelar": {
            "post": {
                "tags": [
                    "Recurso: Reuniões"
                ],
                "operationId": "acaoCancelarReunioes",
                "summary": "Ação: Cancelar",
                "description": "Nível exigido: editar. Cancelar esta reunião?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "reunioes"
            }
        },
        "/r/reunioes/{id}/acao/iniciar": {
            "post": {
                "tags": [
                    "Recurso: Reuniões"
                ],
                "operationId": "acaoIniciarReunioes",
                "summary": "Ação: Iniciar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "reunioes"
            }
        },
        "/r/reunioes/{id}/acao/resumir": {
            "post": {
                "tags": [
                    "Recurso: Reuniões"
                ],
                "operationId": "acaoResumirReunioes",
                "summary": "Ação: Propor resumo das notas",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "reunioes"
            }
        },
        "/r/reunioes/{id}/acao/terminar": {
            "post": {
                "tags": [
                    "Recurso: Reuniões"
                ],
                "operationId": "acaoTerminarReunioes",
                "summary": "Ação: Terminar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.chat:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "reunioes"
            }
        },
        "/r/revisoes_acessos": {
            "get": {
                "tags": [
                    "Recurso: Revisões de acessos"
                ],
                "operationId": "listarRevisoesAcessos",
                "summary": "Listar Revisões de acessos",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[periodo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Trimestre». Lista: a,b; intervalo: f[periodo][de]= e f[periodo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_revisoes_acessos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "revisoes_acessos"
            }
        },
        "/r/revisoes_acessos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Revisões de acessos"
                ],
                "operationId": "esquemaRevisoesAcessos",
                "summary": "Esquema de «Revisões de acessos» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "revisoes_acessos"
            }
        },
        "/r/revisoes_acessos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Revisões de acessos"
                ],
                "operationId": "obterRevisoesAcessos",
                "summary": "Obter Revisão de acessos",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_revisoes_acessos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "revisoes_acessos"
            }
        },
        "/r/revisoes_acessos/{id}/acao/concluir": {
            "post": {
                "tags": [
                    "Recurso: Revisões de acessos"
                ],
                "operationId": "acaoConcluirRevisoesAcessos",
                "summary": "Ação: Concluir",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "notas": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Conclusões",
                                        "maxLength": 5000
                                    },
                                    "alteracoes": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Alterações feitas",
                                        "maxLength": 5000
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "revisoes_acessos"
            }
        },
        "/r/revisoes_acessos/{id}/acao/ver": {
            "post": {
                "tags": [
                    "Recurso: Revisões de acessos"
                ],
                "operationId": "acaoVerRevisoesAcessos",
                "summary": "Ação: Ver instantâneo",
                "description": "Nível exigido: ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "ver",
                "x-anagen-recurso": "revisoes_acessos"
            }
        },
        "/r/segmentos": {
            "get": {
                "tags": [
                    "Recurso: Segmentos"
                ],
                "operationId": "listarSegmentos",
                "summary": "Listar Segmentos",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[usa_dados_clinicos]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Usa dados clínicos». Lista: a,b; intervalo: f[usa_dados_clinicos][de]= e f[usa_dados_clinicos][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_segmentos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "segmentos"
            },
            "post": {
                "tags": [
                    "Recurso: Segmentos"
                ],
                "operationId": "criarSegmentos",
                "summary": "Criar Segmento",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_segmentos_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_segmentos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_segmentos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "segmentos"
            }
        },
        "/r/segmentos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Segmentos"
                ],
                "operationId": "esquemaSegmentos",
                "summary": "Esquema de «Segmentos» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "segmentos"
            }
        },
        "/r/segmentos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Segmentos"
                ],
                "operationId": "obterSegmentos",
                "summary": "Obter Segmento",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_segmentos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "segmentos"
            },
            "put": {
                "tags": [
                    "Recurso: Segmentos"
                ],
                "operationId": "alterarSegmentos",
                "summary": "Alterar Segmento",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_segmentos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_segmentos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "segmentos"
            },
            "delete": {
                "tags": [
                    "Recurso: Segmentos"
                ],
                "operationId": "apagarSegmentos",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "segmentos"
            }
        },
        "/r/segmentos/{id}/acao/contar": {
            "post": {
                "tags": [
                    "Recurso: Segmentos"
                ],
                "operationId": "acaoContarSegmentos",
                "summary": "Ação: Contar agora",
                "description": "Nível exigido: ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "marketing:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "ver",
                "x-anagen-recurso": "segmentos"
            }
        },
        "/r/sequencias": {
            "get": {
                "tags": [
                    "Recurso: Sequências"
                ],
                "operationId": "listarSequencias",
                "summary": "Listar Sequências",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[gatilho]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Começa quando». Lista: a,b; intervalo: f[gatilho][de]= e f[gatilho][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativa]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativa». Lista: a,b; intervalo: f[ativa][de]= e f[ativa][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_sequencias"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "sequencias"
            },
            "post": {
                "tags": [
                    "Recurso: Sequências"
                ],
                "operationId": "criarSequencias",
                "summary": "Criar Sequência",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_sequencias_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_sequencias_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_sequencias"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "sequencias"
            }
        },
        "/r/sequencias/esquema": {
            "get": {
                "tags": [
                    "Recurso: Sequências"
                ],
                "operationId": "esquemaSequencias",
                "summary": "Esquema de «Sequências» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "sequencias"
            }
        },
        "/r/sequencias/{id}": {
            "get": {
                "tags": [
                    "Recurso: Sequências"
                ],
                "operationId": "obterSequencias",
                "summary": "Obter Sequência",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_sequencias"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "sequencias"
            },
            "put": {
                "tags": [
                    "Recurso: Sequências"
                ],
                "operationId": "alterarSequencias",
                "summary": "Alterar Sequência",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_sequencias_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_sequencias"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "sequencias"
            },
            "delete": {
                "tags": [
                    "Recurso: Sequências"
                ],
                "operationId": "apagarSequencias",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.leads:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "sequencias"
            }
        },
        "/r/stock_movimentos": {
            "get": {
                "tags": [
                    "Recurso: Movimentos de stock"
                ],
                "operationId": "listarStockMovimentos",
                "summary": "Listar Movimentos de stock",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[artigo_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Artigo». Lista: a,b; intervalo: f[artigo_id][de]= e f[artigo_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[lote]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Lote». Lista: a,b; intervalo: f[lote][de]= e f[lote][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[validade]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Validade». Lista: a,b; intervalo: f[validade][de]= e f[validade][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[cirurgia_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Cirurgia». Lista: a,b; intervalo: f[cirurgia_id][de]= e f[cirurgia_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[encomenda_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Encomenda». Lista: a,b; intervalo: f[encomenda_id][de]= e f[encomenda_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[criado_em]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Data». Lista: a,b; intervalo: f[criado_em][de]= e f[criado_em][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_stock_movimentos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "stock_movimentos"
            },
            "post": {
                "tags": [
                    "Recurso: Movimentos de stock"
                ],
                "operationId": "criarStockMovimentos",
                "summary": "Criar Movimento de stock",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_stock_movimentos_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_stock_movimentos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_stock_movimentos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "stock_movimentos"
            }
        },
        "/r/stock_movimentos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Movimentos de stock"
                ],
                "operationId": "esquemaStockMovimentos",
                "summary": "Esquema de «Movimentos de stock» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "stock_movimentos"
            }
        },
        "/r/stock_movimentos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Movimentos de stock"
                ],
                "operationId": "obterStockMovimentos",
                "summary": "Obter Movimento de stock",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_stock_movimentos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "stock_movimentos"
            }
        },
        "/r/subcontratantes": {
            "get": {
                "tags": [
                    "Recurso: Subcontratantes"
                ],
                "operationId": "listarSubcontratantes",
                "summary": "Listar Subcontratantes",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[pais]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «País». Lista: a,b; intervalo: f[pais][de]= e f[pais][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[contrato_ate]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Contrato até». Lista: a,b; intervalo: f[contrato_ate][de]= e f[contrato_ate][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[dpa_assinado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Acordo de tratamento assinado». Lista: a,b; intervalo: f[dpa_assinado][de]= e f[dpa_assinado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[sistema_ia]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Sistema de inteligência artificial». Lista: a,b; intervalo: f[sistema_ia][de]= e f[sistema_ia][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[transferencia_internacional]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Transferência para fora do EEE». Lista: a,b; intervalo: f[transferencia_internacional][de]= e f[transferencia_internacional][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativo». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_subcontratantes"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "subcontratantes"
            },
            "post": {
                "tags": [
                    "Recurso: Subcontratantes"
                ],
                "operationId": "criarSubcontratantes",
                "summary": "Criar Subcontratante",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_subcontratantes_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_subcontratantes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_subcontratantes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "subcontratantes"
            }
        },
        "/r/subcontratantes/esquema": {
            "get": {
                "tags": [
                    "Recurso: Subcontratantes"
                ],
                "operationId": "esquemaSubcontratantes",
                "summary": "Esquema de «Subcontratantes» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "subcontratantes"
            }
        },
        "/r/subcontratantes/{id}": {
            "get": {
                "tags": [
                    "Recurso: Subcontratantes"
                ],
                "operationId": "obterSubcontratantes",
                "summary": "Obter Subcontratante",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_subcontratantes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "subcontratantes"
            },
            "put": {
                "tags": [
                    "Recurso: Subcontratantes"
                ],
                "operationId": "alterarSubcontratantes",
                "summary": "Alterar Subcontratante",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_subcontratantes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_subcontratantes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "subcontratantes"
            },
            "delete": {
                "tags": [
                    "Recurso: Subcontratantes"
                ],
                "operationId": "apagarSubcontratantes",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "subcontratantes"
            }
        },
        "/r/supressoes": {
            "get": {
                "tags": [
                    "Recurso: Oposição a contactos"
                ],
                "operationId": "listarSupressoes",
                "summary": "Listar Oposição a contactos",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[canal]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Canal». Lista: a,b; intervalo: f[canal][de]= e f[canal][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[origem]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Origem». Lista: a,b; intervalo: f[origem][de]= e f[origem][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_supressoes"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "supressoes"
            },
            "post": {
                "tags": [
                    "Recurso: Oposição a contactos"
                ],
                "operationId": "criarSupressoes",
                "summary": "Criar Oposição",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_supressoes_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_supressoes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_supressoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "supressoes"
            }
        },
        "/r/supressoes/esquema": {
            "get": {
                "tags": [
                    "Recurso: Oposição a contactos"
                ],
                "operationId": "esquemaSupressoes",
                "summary": "Esquema de «Oposição a contactos» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "supressoes"
            }
        },
        "/r/supressoes/{id}": {
            "get": {
                "tags": [
                    "Recurso: Oposição a contactos"
                ],
                "operationId": "obterSupressoes",
                "summary": "Obter Oposição",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_supressoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "supressoes"
            },
            "delete": {
                "tags": [
                    "Recurso: Oposição a contactos"
                ],
                "operationId": "apagarSupressoes",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "conformidade:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "supressoes"
            }
        },
        "/r/tabelas_precos": {
            "get": {
                "tags": [
                    "Recurso: Tabelas de preços"
                ],
                "operationId": "listarTabelasPrecos",
                "summary": "Listar Tabelas de preços",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[procedimento_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Procedimento». Lista: a,b; intervalo: f[procedimento_id][de]= e f[procedimento_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[local_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Local». Lista: a,b; intervalo: f[local_id][de]= e f[local_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativa]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativa». Lista: a,b; intervalo: f[ativa][de]= e f[ativa][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_tabelas_precos"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "tabelas_precos"
            },
            "post": {
                "tags": [
                    "Recurso: Tabelas de preços"
                ],
                "operationId": "criarTabelasPrecos",
                "summary": "Criar Tabela de preços",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_tabelas_precos_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_tabelas_precos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_tabelas_precos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "tabelas_precos"
            }
        },
        "/r/tabelas_precos/esquema": {
            "get": {
                "tags": [
                    "Recurso: Tabelas de preços"
                ],
                "operationId": "esquemaTabelasPrecos",
                "summary": "Esquema de «Tabelas de preços» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "tabelas_precos"
            }
        },
        "/r/tabelas_precos/{id}": {
            "get": {
                "tags": [
                    "Recurso: Tabelas de preços"
                ],
                "operationId": "obterTabelasPrecos",
                "summary": "Obter Tabela de preços",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_tabelas_precos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "tabelas_precos"
            },
            "put": {
                "tags": [
                    "Recurso: Tabelas de preços"
                ],
                "operationId": "alterarTabelasPrecos",
                "summary": "Alterar Tabela de preços",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_tabelas_precos_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_tabelas_precos"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "tabelas_precos"
            },
            "delete": {
                "tags": [
                    "Recurso: Tabelas de preços"
                ],
                "operationId": "apagarTabelasPrecos",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "tabelas_precos"
            }
        },
        "/r/tabelas_precos/{id}/acao/simular": {
            "post": {
                "tags": [
                    "Recurso: Tabelas de preços"
                ],
                "operationId": "acaoSimularTabelasPrecos",
                "summary": "Ação: Simular",
                "description": "Nível exigido: ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "enxertos": {
                                        "type": [
                                            "number",
                                            "null"
                                        ],
                                        "title": "Enxertos",
                                        "maximum": 15000,
                                        "minimum": 1,
                                        "x-unidade": "enxertos"
                                    },
                                    "sessoes": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "title": "Sessões",
                                        "maximum": 6,
                                        "minimum": 1,
                                        "default": 1
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "ver",
                "x-anagen-recurso": "tabelas_precos"
            }
        },
        "/r/tarefas": {
            "get": {
                "tags": [
                    "Recurso: Tarefas"
                ],
                "operationId": "listarTarefas",
                "summary": "Listar Tarefas",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.tarefas:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[prioridade]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Prioridade». Lista: a,b; intervalo: f[prioridade][de]= e f[prioridade][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[prazo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Prazo». Lista: a,b; intervalo: f[prazo][de]= e f[prazo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[responsavel_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Responsável». Lista: a,b; intervalo: f[responsavel_id][de]= e f[responsavel_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[departamento]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Departamento». Lista: a,b; intervalo: f[departamento][de]= e f[departamento][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[origem]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Origem». Lista: a,b; intervalo: f[origem][de]= e f[origem][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_tarefas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "tarefas"
            },
            "post": {
                "tags": [
                    "Recurso: Tarefas"
                ],
                "operationId": "criarTarefas",
                "summary": "Criar Tarefa",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.tarefas:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_tarefas_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_tarefas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_tarefas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "tarefas"
            }
        },
        "/r/tarefas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Tarefas"
                ],
                "operationId": "esquemaTarefas",
                "summary": "Esquema de «Tarefas» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.tarefas:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "tarefas"
            }
        },
        "/r/tarefas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Tarefas"
                ],
                "operationId": "obterTarefas",
                "summary": "Obter Tarefa",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.tarefas:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_tarefas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "tarefas"
            },
            "put": {
                "tags": [
                    "Recurso: Tarefas"
                ],
                "operationId": "alterarTarefas",
                "summary": "Alterar Tarefa",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.tarefas:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_tarefas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_tarefas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "tarefas"
            },
            "delete": {
                "tags": [
                    "Recurso: Tarefas"
                ],
                "operationId": "apagarTarefas",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.tarefas:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "tarefas"
            }
        },
        "/r/tarefas/{id}/acao/concluir": {
            "post": {
                "tags": [
                    "Recurso: Tarefas"
                ],
                "operationId": "acaoConcluirTarefas",
                "summary": "Ação: Concluir",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.tarefas:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "tarefas"
            }
        },
        "/r/tarefas/{id}/acao/reabrir": {
            "post": {
                "tags": [
                    "Recurso: Tarefas"
                ],
                "operationId": "acaoReabrirTarefas",
                "summary": "Ação: Reabrir",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.tarefas:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "tarefas"
            }
        },
        "/r/teleconsultas": {
            "get": {
                "tags": [
                    "Recurso: Teleconsultas"
                ],
                "operationId": "listarTeleconsultas",
                "summary": "Listar Teleconsultas",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão. Cada leitura fica na auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "teleconsulta:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[medico_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Médico». Lista: a,b; intervalo: f[medico_id][de]= e f[medico_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_teleconsultas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "teleconsultas"
            }
        },
        "/r/teleconsultas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Teleconsultas"
                ],
                "operationId": "esquemaTeleconsultas",
                "summary": "Esquema de «Teleconsultas» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "teleconsulta:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "teleconsultas"
            }
        },
        "/r/teleconsultas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Teleconsultas"
                ],
                "operationId": "obterTeleconsultas",
                "summary": "Obter Teleconsulta",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "teleconsulta:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_teleconsultas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "teleconsultas"
            }
        },
        "/r/telefonia_extensoes": {
            "get": {
                "tags": [
                    "Recurso: Extensões"
                ],
                "operationId": "listarTelefoniaExtensoes",
                "summary": "Listar Extensões",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_telefonia_extensoes"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "telefonia_extensoes"
            },
            "post": {
                "tags": [
                    "Recurso: Extensões"
                ],
                "operationId": "criarTelefoniaExtensoes",
                "summary": "Criar Extensão",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_telefonia_extensoes_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_telefonia_extensoes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_telefonia_extensoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "telefonia_extensoes"
            }
        },
        "/r/telefonia_extensoes/esquema": {
            "get": {
                "tags": [
                    "Recurso: Extensões"
                ],
                "operationId": "esquemaTelefoniaExtensoes",
                "summary": "Esquema de «Extensões» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "telefonia_extensoes"
            }
        },
        "/r/telefonia_extensoes/{id}": {
            "get": {
                "tags": [
                    "Recurso: Extensões"
                ],
                "operationId": "obterTelefoniaExtensoes",
                "summary": "Obter Extensão",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_telefonia_extensoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "telefonia_extensoes"
            },
            "put": {
                "tags": [
                    "Recurso: Extensões"
                ],
                "operationId": "alterarTelefoniaExtensoes",
                "summary": "Alterar Extensão",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_telefonia_extensoes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_telefonia_extensoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "telefonia_extensoes"
            },
            "delete": {
                "tags": [
                    "Recurso: Extensões"
                ],
                "operationId": "apagarTelefoniaExtensoes",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "telefonia_extensoes"
            }
        },
        "/r/telefonia_numeros": {
            "get": {
                "tags": [
                    "Recurso: Números da clínica"
                ],
                "operationId": "listarTelefoniaNumeros",
                "summary": "Listar Números da clínica",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[origem]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Origem do lead». Lista: a,b; intervalo: f[origem][de]= e f[origem][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativo». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_telefonia_numeros"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "telefonia_numeros"
            },
            "post": {
                "tags": [
                    "Recurso: Números da clínica"
                ],
                "operationId": "criarTelefoniaNumeros",
                "summary": "Criar Número",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_telefonia_numeros_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_telefonia_numeros_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_telefonia_numeros"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "telefonia_numeros"
            }
        },
        "/r/telefonia_numeros/esquema": {
            "get": {
                "tags": [
                    "Recurso: Números da clínica"
                ],
                "operationId": "esquemaTelefoniaNumeros",
                "summary": "Esquema de «Números da clínica» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "telefonia_numeros"
            }
        },
        "/r/telefonia_numeros/{id}": {
            "get": {
                "tags": [
                    "Recurso: Números da clínica"
                ],
                "operationId": "obterTelefoniaNumeros",
                "summary": "Obter Número",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_telefonia_numeros"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "telefonia_numeros"
            },
            "put": {
                "tags": [
                    "Recurso: Números da clínica"
                ],
                "operationId": "alterarTelefoniaNumeros",
                "summary": "Alterar Número",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_telefonia_numeros_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_telefonia_numeros"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "telefonia_numeros"
            },
            "delete": {
                "tags": [
                    "Recurso: Números da clínica"
                ],
                "operationId": "apagarTelefoniaNumeros",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "telefonia_numeros"
            }
        },
        "/r/terminais_pagamento": {
            "get": {
                "tags": [
                    "Recurso: Terminais de pagamento"
                ],
                "operationId": "listarTerminaisPagamento",
                "summary": "Listar Terminais de pagamento",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[fornecedor]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Fornecedor». Lista: a,b; intervalo: f[fornecedor][de]= e f[fornecedor][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[local_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Local». Lista: a,b; intervalo: f[local_id][de]= e f[local_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_terminais_pagamento"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "terminais_pagamento"
            },
            "post": {
                "tags": [
                    "Recurso: Terminais de pagamento"
                ],
                "operationId": "criarTerminaisPagamento",
                "summary": "Criar Terminal de pagamento",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_terminais_pagamento_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_terminais_pagamento_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_terminais_pagamento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "terminais_pagamento"
            }
        },
        "/r/terminais_pagamento/esquema": {
            "get": {
                "tags": [
                    "Recurso: Terminais de pagamento"
                ],
                "operationId": "esquemaTerminaisPagamento",
                "summary": "Esquema de «Terminais de pagamento» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "terminais_pagamento"
            }
        },
        "/r/terminais_pagamento/{id}": {
            "get": {
                "tags": [
                    "Recurso: Terminais de pagamento"
                ],
                "operationId": "obterTerminaisPagamento",
                "summary": "Obter Terminal de pagamento",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_terminais_pagamento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "terminais_pagamento"
            },
            "put": {
                "tags": [
                    "Recurso: Terminais de pagamento"
                ],
                "operationId": "alterarTerminaisPagamento",
                "summary": "Alterar Terminal de pagamento",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_terminais_pagamento_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_terminais_pagamento"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "terminais_pagamento"
            },
            "delete": {
                "tags": [
                    "Recurso: Terminais de pagamento"
                ],
                "operationId": "apagarTerminaisPagamento",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "terminais_pagamento"
            }
        },
        "/r/terminais_pagamento/{id}/acao/emparelhar": {
            "post": {
                "tags": [
                    "Recurso: Terminais de pagamento"
                ],
                "operationId": "acaoEmparelharTerminaisPagamento",
                "summary": "Ação: Emparelhar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "codigo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Código do aparelho",
                                        "description": "SumUp: Ligações › API › Ligar. Stripe: código de registo mostrado no leitor.",
                                        "maxLength": 60
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "terminais_pagamento"
            }
        },
        "/r/terminais_pagamento/{id}/acao/verificar": {
            "post": {
                "tags": [
                    "Recurso: Terminais de pagamento"
                ],
                "operationId": "acaoVerificarTerminaisPagamento",
                "summary": "Ação: Verificar estado",
                "description": "Nível exigido: ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "ver",
                "x-anagen-recurso": "terminais_pagamento"
            }
        },
        "/r/tratamentos_complementares": {
            "get": {
                "tags": [
                    "Recurso: Tratamentos complementares"
                ],
                "operationId": "listarTratamentosComplementares",
                "summary": "Listar Tratamentos complementares",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão. Cada leitura fica na auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[tipo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tratamento». Lista: a,b; intervalo: f[tipo][de]= e f[tipo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[inicio]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Início». Lista: a,b; intervalo: f[inicio][de]= e f[inicio][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[adesao]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Adesão». Lista: a,b; intervalo: f[adesao][de]= e f[adesao][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_tratamentos_complementares"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "tratamentos_complementares"
            },
            "post": {
                "tags": [
                    "Recurso: Tratamentos complementares"
                ],
                "operationId": "criarTratamentosComplementares",
                "summary": "Criar Tratamento complementar",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_tratamentos_complementares_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_tratamentos_complementares_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_tratamentos_complementares"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "tratamentos_complementares"
            }
        },
        "/r/tratamentos_complementares/esquema": {
            "get": {
                "tags": [
                    "Recurso: Tratamentos complementares"
                ],
                "operationId": "esquemaTratamentosComplementares",
                "summary": "Esquema de «Tratamentos complementares» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "tratamentos_complementares"
            }
        },
        "/r/tratamentos_complementares/{id}": {
            "get": {
                "tags": [
                    "Recurso: Tratamentos complementares"
                ],
                "operationId": "obterTratamentosComplementares",
                "summary": "Obter Tratamento complementar",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_tratamentos_complementares"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "tratamentos_complementares"
            },
            "put": {
                "tags": [
                    "Recurso: Tratamentos complementares"
                ],
                "operationId": "alterarTratamentosComplementares",
                "summary": "Alterar Tratamento complementar",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_tratamentos_complementares_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_tratamentos_complementares"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "tratamentos_complementares"
            },
            "delete": {
                "tags": [
                    "Recurso: Tratamentos complementares"
                ],
                "operationId": "apagarTratamentosComplementares",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "tratamentos_complementares"
            }
        },
        "/r/tratamentos_complementares/{id}/acao/registar_sessao": {
            "post": {
                "tags": [
                    "Recurso: Tratamentos complementares"
                ],
                "operationId": "acaoRegistarSessaoTratamentosComplementares",
                "summary": "Ação: Registar sessão",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "acompanhamento:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "proxima_sessao_em": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date",
                                        "title": "Próxima sessão"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "tratamentos_complementares"
            }
        },
        "/r/tricoscopias": {
            "get": {
                "tags": [
                    "Recurso: Campos de tricoscopia"
                ],
                "operationId": "listarTricoscopias",
                "summary": "Listar Campos de tricoscopia",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão. Cada leitura fica na auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente». Lista: a,b; intervalo: f[paciente_id][de]= e f[paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[captura_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Captura». Lista: a,b; intervalo: f[captura_id][de]= e f[captura_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[data]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Data». Lista: a,b; intervalo: f[data][de]= e f[data][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[subzona]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Subzona». Lista: a,b; intervalo: f[subzona][de]= e f[subzona][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[aparelho]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Aparelho». Lista: a,b; intervalo: f[aparelho][de]= e f[aparelho][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_tricoscopias"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "tricoscopias"
            },
            "post": {
                "tags": [
                    "Recurso: Campos de tricoscopia"
                ],
                "operationId": "criarTricoscopias",
                "summary": "Criar Campo de tricoscopia",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_tricoscopias_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_tricoscopias_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_tricoscopias"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "tricoscopias"
            }
        },
        "/r/tricoscopias/esquema": {
            "get": {
                "tags": [
                    "Recurso: Campos de tricoscopia"
                ],
                "operationId": "esquemaTricoscopias",
                "summary": "Esquema de «Campos de tricoscopia» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "tricoscopias"
            }
        },
        "/r/tricoscopias/{id}": {
            "get": {
                "tags": [
                    "Recurso: Campos de tricoscopia"
                ],
                "operationId": "obterTricoscopias",
                "summary": "Obter Campo de tricoscopia",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_tricoscopias"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "tricoscopias"
            },
            "put": {
                "tags": [
                    "Recurso: Campos de tricoscopia"
                ],
                "operationId": "alterarTricoscopias",
                "summary": "Alterar Campo de tricoscopia",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_tricoscopias_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_tricoscopias"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "tricoscopias"
            },
            "delete": {
                "tags": [
                    "Recurso: Campos de tricoscopia"
                ],
                "operationId": "apagarTricoscopias",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "tricoscopias"
            }
        },
        "/r/utilizadores": {
            "get": {
                "tags": [
                    "Recurso: Utilizadores"
                ],
                "operationId": "listarUtilizadores",
                "summary": "Listar Utilizadores",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[perfil_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Perfil». Lista: a,b; intervalo: f[perfil_id][de]= e f[perfil_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[nivel]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Nível». Lista: a,b; intervalo: f[nivel][de]= e f[nivel][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[departamento]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Departamento». Lista: a,b; intervalo: f[departamento][de]= e f[departamento][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[direcao_clinica]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Direção clínica». Lista: a,b; intervalo: f[direcao_clinica][de]= e f[direcao_clinica][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativo». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[totp_ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Segundo fator». Lista: a,b; intervalo: f[totp_ativo][de]= e f[totp_ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_utilizadores"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "utilizadores"
            },
            "post": {
                "tags": [
                    "Recurso: Utilizadores"
                ],
                "operationId": "criarUtilizadores",
                "summary": "Criar Utilizador",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_utilizadores_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_utilizadores_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_utilizadores"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "utilizadores"
            }
        },
        "/r/utilizadores/esquema": {
            "get": {
                "tags": [
                    "Recurso: Utilizadores"
                ],
                "operationId": "esquemaUtilizadores",
                "summary": "Esquema de «Utilizadores» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "utilizadores"
            }
        },
        "/r/utilizadores/{id}": {
            "get": {
                "tags": [
                    "Recurso: Utilizadores"
                ],
                "operationId": "obterUtilizadores",
                "summary": "Obter Utilizador",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_utilizadores"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "utilizadores"
            },
            "put": {
                "tags": [
                    "Recurso: Utilizadores"
                ],
                "operationId": "alterarUtilizadores",
                "summary": "Alterar Utilizador",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_utilizadores_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_utilizadores"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "utilizadores"
            },
            "delete": {
                "tags": [
                    "Recurso: Utilizadores"
                ],
                "operationId": "apagarUtilizadores",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "utilizadores"
            }
        },
        "/r/utilizadores/{id}/acao/desbloquear": {
            "post": {
                "tags": [
                    "Recurso: Utilizadores"
                ],
                "operationId": "acaoDesbloquearUtilizadores",
                "summary": "Ação: Desbloquear",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "utilizadores"
            }
        },
        "/r/utilizadores/{id}/acao/enviar_convite": {
            "post": {
                "tags": [
                    "Recurso: Utilizadores"
                ],
                "operationId": "acaoEnviarConviteUtilizadores",
                "summary": "Ação: Enviar convite",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "utilizadores"
            }
        },
        "/r/utilizadores/{id}/acao/repor_2fa": {
            "post": {
                "tags": [
                    "Recurso: Utilizadores"
                ],
                "operationId": "acaoRepor2faUtilizadores",
                "summary": "Ação: Repor segundo fator",
                "description": "Nível exigido: editar. Repor o segundo fator? A pessoa configura-o de novo na próxima entrada.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "utilizadores"
            }
        },
        "/r/utilizadores/{id}/acao/revogar_sessoes": {
            "post": {
                "tags": [
                    "Recurso: Utilizadores"
                ],
                "operationId": "acaoRevogarSessoesUtilizadores",
                "summary": "Ação: Terminar sessões",
                "description": "Nível exigido: editar. Terminar todas as sessões desta pessoa (web e aplicação)?",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.utilizadores:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "utilizadores"
            }
        },
        "/r/vales": {
            "get": {
                "tags": [
                    "Recurso: Vales de oferta"
                ],
                "operationId": "listarVales",
                "summary": "Listar Vales de oferta",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[validade]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Válido até». Lista: a,b; intervalo: f[validade][de]= e f[validade][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[finalidade]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Tipo de vale». Lista: a,b; intervalo: f[finalidade][de]= e f[finalidade][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[comprador_paciente_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Paciente comprador». Lista: a,b; intervalo: f[comprador_paciente_id][de]= e f[comprador_paciente_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[local_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Local». Lista: a,b; intervalo: f[local_id][de]= e f[local_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_vales"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "vales"
            }
        },
        "/r/vales/esquema": {
            "get": {
                "tags": [
                    "Recurso: Vales de oferta"
                ],
                "operationId": "esquemaVales",
                "summary": "Esquema de «Vales de oferta» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "vales"
            }
        },
        "/r/vales/{id}": {
            "get": {
                "tags": [
                    "Recurso: Vales de oferta"
                ],
                "operationId": "obterVales",
                "summary": "Obter Vale de oferta",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_vales"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "vales"
            },
            "put": {
                "tags": [
                    "Recurso: Vales de oferta"
                ],
                "operationId": "alterarVales",
                "summary": "Alterar Vale de oferta",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_vales_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_vales"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "vales"
            }
        },
        "/r/vales/{id}/acao/anular": {
            "post": {
                "tags": [
                    "Recurso: Vales de oferta"
                ],
                "operationId": "acaoAnularVales",
                "summary": "Ação: Anular vale",
                "description": "Nível exigido: editar. Anular o vale? O pagamento da venda é cancelado ou reembolsado.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "financeiro.pagamentos:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "title": "Motivo",
                                        "maxLength": 255
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "vales"
            }
        },
        "/r/voz_gravacoes": {
            "get": {
                "tags": [
                    "Recurso: Mensagens gravadas"
                ],
                "operationId": "listarVozGravacoes",
                "summary": "Listar Mensagens gravadas",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[lingua]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Língua». Lista: a,b; intervalo: f[lingua][de]= e f[lingua][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativa». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_voz_gravacoes"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "voz_gravacoes"
            },
            "post": {
                "tags": [
                    "Recurso: Mensagens gravadas"
                ],
                "operationId": "criarVozGravacoes",
                "summary": "Criar Mensagem gravada",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_voz_gravacoes_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_voz_gravacoes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_voz_gravacoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "voz_gravacoes"
            }
        },
        "/r/voz_gravacoes/esquema": {
            "get": {
                "tags": [
                    "Recurso: Mensagens gravadas"
                ],
                "operationId": "esquemaVozGravacoes",
                "summary": "Esquema de «Mensagens gravadas» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "voz_gravacoes"
            }
        },
        "/r/voz_gravacoes/{id}": {
            "get": {
                "tags": [
                    "Recurso: Mensagens gravadas"
                ],
                "operationId": "obterVozGravacoes",
                "summary": "Obter Mensagem gravada",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_voz_gravacoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "voz_gravacoes"
            },
            "put": {
                "tags": [
                    "Recurso: Mensagens gravadas"
                ],
                "operationId": "alterarVozGravacoes",
                "summary": "Alterar Mensagem gravada",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_voz_gravacoes_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_voz_gravacoes"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "voz_gravacoes"
            },
            "delete": {
                "tags": [
                    "Recurso: Mensagens gravadas"
                ],
                "operationId": "apagarVozGravacoes",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "voz_gravacoes"
            }
        },
        "/r/voz_menus": {
            "get": {
                "tags": [
                    "Recurso: Menus de voz"
                ],
                "operationId": "listarVozMenus",
                "summary": "Listar Menus de voz",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativo». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_voz_menus"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "voz_menus"
            },
            "post": {
                "tags": [
                    "Recurso: Menus de voz"
                ],
                "operationId": "criarVozMenus",
                "summary": "Criar Menu de voz",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_voz_menus_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_voz_menus_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_voz_menus"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "voz_menus"
            }
        },
        "/r/voz_menus/esquema": {
            "get": {
                "tags": [
                    "Recurso: Menus de voz"
                ],
                "operationId": "esquemaVozMenus",
                "summary": "Esquema de «Menus de voz» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "voz_menus"
            }
        },
        "/r/voz_menus/{id}": {
            "get": {
                "tags": [
                    "Recurso: Menus de voz"
                ],
                "operationId": "obterVozMenus",
                "summary": "Obter Menu de voz",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_voz_menus"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "voz_menus"
            },
            "put": {
                "tags": [
                    "Recurso: Menus de voz"
                ],
                "operationId": "alterarVozMenus",
                "summary": "Alterar Menu de voz",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_voz_menus_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_voz_menus"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "voz_menus"
            },
            "delete": {
                "tags": [
                    "Recurso: Menus de voz"
                ],
                "operationId": "apagarVozMenus",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "voz_menus"
            }
        },
        "/r/voz_menus/{id}/acao/editor": {
            "post": {
                "tags": [
                    "Recurso: Menus de voz"
                ],
                "operationId": "acaoEditorVozMenus",
                "summary": "Ação: Abrir o editor",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "crm.telefonia:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "voz_menus"
            }
        },
        "/r/webhooks": {
            "get": {
                "tags": [
                    "Recurso: Webhooks"
                ],
                "operationId": "listarWebhooks",
                "summary": "Listar Webhooks",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[ativo]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativo». Lista: a,b; intervalo: f[ativo][de]= e f[ativo][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_webhooks"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "webhooks"
            },
            "post": {
                "tags": [
                    "Recurso: Webhooks"
                ],
                "operationId": "criarWebhooks",
                "summary": "Criar Destino de webhook",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_webhooks_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_webhooks_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_webhooks"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "webhooks"
            }
        },
        "/r/webhooks/esquema": {
            "get": {
                "tags": [
                    "Recurso: Webhooks"
                ],
                "operationId": "esquemaWebhooks",
                "summary": "Esquema de «Webhooks» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "webhooks"
            }
        },
        "/r/webhooks/{id}": {
            "get": {
                "tags": [
                    "Recurso: Webhooks"
                ],
                "operationId": "obterWebhooks",
                "summary": "Obter Destino de webhook",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_webhooks"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "webhooks"
            },
            "put": {
                "tags": [
                    "Recurso: Webhooks"
                ],
                "operationId": "alterarWebhooks",
                "summary": "Alterar Destino de webhook",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_webhooks_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_webhooks"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "webhooks"
            },
            "delete": {
                "tags": [
                    "Recurso: Webhooks"
                ],
                "operationId": "apagarWebhooks",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "webhooks"
            }
        },
        "/r/webhooks/{id}/acao/rodar_segredo": {
            "post": {
                "tags": [
                    "Recurso: Webhooks"
                ],
                "operationId": "acaoRodarSegredoWebhooks",
                "summary": "Ação: Rodar segredo",
                "description": "Nível exigido: editar. Gerar um segredo novo? O atual deixa de servir e o destino tem de ser atualizado.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "webhooks"
            }
        },
        "/r/webhooks/{id}/acao/testar": {
            "post": {
                "tags": [
                    "Recurso: Webhooks"
                ],
                "operationId": "acaoTestarWebhooks",
                "summary": "Ação: Enviar teste",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "webhooks"
            }
        },
        "/r/webhooks_entregas": {
            "get": {
                "tags": [
                    "Recurso: Entregas de webhooks"
                ],
                "operationId": "listarWebhooksEntregas",
                "summary": "Listar Entregas de webhooks",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[webhook_id]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Destino». Lista: a,b; intervalo: f[webhook_id][de]= e f[webhook_id][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[evento]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Evento». Lista: a,b; intervalo: f[evento][de]= e f[evento][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[estado]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Estado». Lista: a,b; intervalo: f[estado][de]= e f[estado][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_webhooks_entregas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "webhooks_entregas"
            }
        },
        "/r/webhooks_entregas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Entregas de webhooks"
                ],
                "operationId": "esquemaWebhooksEntregas",
                "summary": "Esquema de «Entregas de webhooks» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "webhooks_entregas"
            }
        },
        "/r/webhooks_entregas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Entregas de webhooks"
                ],
                "operationId": "obterWebhooksEntregas",
                "summary": "Obter Entrega",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_webhooks_entregas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "webhooks_entregas"
            }
        },
        "/r/webhooks_entregas/{id}/acao/reenviar": {
            "post": {
                "tags": [
                    "Recurso: Entregas de webhooks"
                ],
                "operationId": "acaoReenviarWebhooksEntregas",
                "summary": "Ação: Reenviar",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "webhooks_entregas"
            }
        },
        "/r/whatsapp_linhas": {
            "get": {
                "tags": [
                    "Recurso: Linhas de WhatsApp"
                ],
                "operationId": "listarWhatsappLinhas",
                "summary": "Listar Linhas de WhatsApp",
                "description": "Pesquisa, filtros, ordenação e paginação; respeita o âmbito (próprios/equipa/todos) e retira campos sem permissão.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/Q"
                    },
                    {
                        "$ref": "#/components/parameters/Ordem"
                    },
                    {
                        "$ref": "#/components/parameters/Pagina"
                    },
                    {
                        "$ref": "#/components/parameters/PorPagina"
                    },
                    {
                        "name": "f[departamento]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Departamento». Lista: a,b; intervalo: f[departamento][de]= e f[departamento][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "f[ativa]",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "description": "Filtro por «Ativa». Lista: a,b; intervalo: f[ativa][de]= e f[ativa][ate]=.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de resultados",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Recurso_whatsapp_linhas"
                                            }
                                        },
                                        "meta": {
                                            "$ref": "#/components/schemas/Meta"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "whatsapp_linhas"
            },
            "post": {
                "tags": [
                    "Recurso: Linhas de WhatsApp"
                ],
                "operationId": "criarWhatsappLinhas",
                "summary": "Criar Linha de WhatsApp",
                "description": "Validação no servidor gerada da definição dos campos. Aceita Idempotency-Key.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_whatsapp_linhas_Entrada"
                            }
                        },
                        "multipart/form-data": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_whatsapp_linhas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_whatsapp_linhas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "whatsapp_linhas"
            }
        },
        "/r/whatsapp_linhas/esquema": {
            "get": {
                "tags": [
                    "Recurso: Linhas de WhatsApp"
                ],
                "operationId": "esquemaWhatsappLinhas",
                "summary": "Esquema de «Linhas de WhatsApp» (campos, secções, ações)",
                "description": "Devolve só os campos e ações a que quem pede tem acesso, com rótulos na língua pedida.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/EsquemaRecurso"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "whatsapp_linhas"
            }
        },
        "/r/whatsapp_linhas/{id}": {
            "get": {
                "tags": [
                    "Recurso: Linhas de WhatsApp"
                ],
                "operationId": "obterWhatsappLinhas",
                "summary": "Obter Linha de WhatsApp",
                "description": "Registo dentro do âmbito (fora do âmbito responde 404). Campos cifrados vêm decifrados só para quem os pode ver.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_whatsapp_linhas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "resumo",
                "x-anagen-recurso": "whatsapp_linhas"
            },
            "put": {
                "tags": [
                    "Recurso: Linhas de WhatsApp"
                ],
                "operationId": "alterarWhatsappLinhas",
                "summary": "Alterar Linha de WhatsApp",
                "description": "Alteração parcial: só os campos enviados.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/Recurso_whatsapp_linhas_Entrada"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Recurso_whatsapp_linhas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "whatsapp_linhas"
            },
            "delete": {
                "tags": [
                    "Recurso: Linhas de WhatsApp"
                ],
                "operationId": "apagarWhatsappLinhas",
                "summary": "Apagar (arquivo lógico)",
                "description": "O registo deixa de aparecer mas mantém-se para efeitos legais e de auditoria.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "whatsapp_linhas"
            }
        },
        "/r/whatsapp_linhas/{id}/acao/testar": {
            "post": {
                "tags": [
                    "Recurso: Linhas de WhatsApp"
                ],
                "operationId": "acaoTestarWhatsappLinhas",
                "summary": "Ação: Testar a linha",
                "description": "Nível exigido: editar.",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "admin.definicoes:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 1
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {}
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            },
                            "X-RateLimit-Remaining": {
                                "$ref": "#/components/headers/XRateLimitRemaining"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ResultadoAcao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "x-anagen-recurso": "whatsapp_linhas"
            }
        },
        "/reunioes/{id}/acoes/{acao}/aprovar": {
            "post": {
                "tags": [
                    "Reuniões"
                ],
                "operationId": "aprovarAcaoReuniao",
                "summary": "Aprovar uma ação (cria a tarefa)",
                "description": "Cria a tarefa com o responsável e o prazo escolhidos. O título é o enviado em «titulo» ou um título neutro com o nome da reunião — o texto da ação (cifrado) não passa para a tarefa. Exige ainda equipa.tarefas editar.",
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador da reunião"
                    },
                    {
                        "name": "acao",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador da ação"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "responsavel_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "prazo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date"
                                    },
                                    "titulo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "maxLength": 200
                                    },
                                    "prioridade": {
                                        "type": "string",
                                        "enum": [
                                            "baixa",
                                            "normal",
                                            "alta",
                                            "urgente"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "responsavel_id": 9,
                                "prazo": "2026-11-03",
                                "titulo": "Rever o stock de agulhas"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "tarefa_id": {
                                                    "type": "integer"
                                                },
                                                "sessao": {
                                                    "$ref": "#/components/schemas/SessaoReuniao"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/reunioes/{id}/acoes/{acao}/rejeitar": {
            "post": {
                "tags": [
                    "Reuniões"
                ],
                "operationId": "rejeitarAcaoReuniao",
                "summary": "Rejeitar uma ação",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador da reunião"
                    },
                    {
                        "name": "acao",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador da ação"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/SessaoReuniao"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    }
                }
            }
        },
        "/reunioes/{id}/audio": {
            "post": {
                "tags": [
                    "Reuniões"
                ],
                "operationId": "enviarAudioReuniao",
                "summary": "Enviar uma parte do áudio",
                "description": "Parte numerada (WAV 16 kHz mono recomendado; MP3, M4A, OGG e WEBM aceites; até 25 MB e 15 min). Exige: reunião gravada/transcrita com aviso, pelo menos uma presença e TODAS com consentimento. A parte fica cifrada em repouso e é transcrita logo (serviço local primeiro; serviço externo só com autorização para dados da equipa). O áudio é apagado depois do prazo das Definições. Partes repetidas são ignoradas (repetida=true).",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador da reunião"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ficheiro"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary"
                                    },
                                    "parte": {
                                        "type": "integer",
                                        "minimum": 1
                                    },
                                    "lingua": {
                                        "type": "string",
                                        "example": "pt-PT"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "parte": {
                                                    "type": "integer"
                                                },
                                                "estado": {
                                                    "type": "string",
                                                    "enum": [
                                                        "recebido",
                                                        "transcrito",
                                                        "erro"
                                                    ]
                                                },
                                                "repetida": {
                                                    "type": "boolean"
                                                },
                                                "sessao": {
                                                    "$ref": "#/components/schemas/SessaoReuniao"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/reunioes/{id}/consentir": {
            "post": {
                "tags": [
                    "Reuniões"
                ],
                "operationId": "consentirGravacaoReuniao",
                "summary": "A minha decisão sobre a gravação",
                "description": "O próprio participante dá, recusa ou retira o consentimento. Uma recusa ou retirada impede novas partes de áudio. Fica registado com data, origem e IP.",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador da reunião"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "consentimento"
                                ],
                                "properties": {
                                    "consentimento": {
                                        "type": "string",
                                        "enum": [
                                            "dado",
                                            "recusado",
                                            "retirado"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "consentimento": "dado"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/SessaoReuniao"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/reunioes/{id}/presencas": {
            "post": {
                "tags": [
                    "Reuniões"
                ],
                "operationId": "registarPresencaReuniao",
                "summary": "Registar a presença e a decisão de outra pessoa",
                "description": "Quem organiza regista a decisão dita na sala por um colega (utilizador_id) ou por um convidado externo (nome, guardado cifrado).",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador da reunião"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "utilizador_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "nome": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "maxLength": 120
                                    },
                                    "consentimento": {
                                        "type": "string",
                                        "enum": [
                                            "dado",
                                            "recusado"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "utilizador_id": 9,
                                "consentimento": "dado"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/SessaoReuniao"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/reunioes/{id}/resumo": {
            "put": {
                "tags": [
                    "Reuniões"
                ],
                "operationId": "gravarResumoReuniao",
                "summary": "Guardar (e validar) o resumo",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador da reunião"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "resumo"
                                ],
                                "properties": {
                                    "resumo": {
                                        "type": "string",
                                        "maxLength": 20000
                                    },
                                    "validar": {
                                        "type": "boolean"
                                    }
                                }
                            },
                            "example": {
                                "resumo": "Revisão da agenda…",
                                "validar": true
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/SessaoReuniao"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/reunioes/{id}/resumo/propor": {
            "post": {
                "tags": [
                    "Reuniões"
                ],
                "operationId": "proporResumoReuniao",
                "summary": "Pedir ao Assistente o resumo e as ações",
                "description": "A partir da transcrição (e das notas), devolve um resumo com as decisões e cria as ações propostas (texto, responsável e prazo quando ditos). Fica como PROPOSTA até validação humana. 503 quando o Assistente não está disponível.",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador da reunião"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/SessaoReuniao"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    },
                    "503": {
                        "description": "Assistente indisponível"
                    }
                }
            }
        },
        "/reunioes/{id}/sessao": {
            "get": {
                "tags": [
                    "Reuniões"
                ],
                "operationId": "obterSessaoReuniao",
                "summary": "Estado da reunião (gravação, presenças, resumo, ações)",
                "description": "Tudo o que o ecrã da reunião precisa, SEM o texto da transcrição (lido à parte, com auditoria). Acesso: participante, organizador ou gestor (equipa.chat editar com âmbito «todos»).",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador da reunião"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/SessaoReuniao"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "reuniao": {
                                            "id": 12,
                                            "titulo": "Reunião de equipa semanal",
                                            "inicio": "2026-10-29T09:00:00+00:00",
                                            "estado": "em_curso",
                                            "gravada": true,
                                            "transcrita": true,
                                            "aviso_gravacao_em": "2026-10-28T17:00:00+00:00",
                                            "lingua": "pt-PT"
                                        },
                                        "participantes": [
                                            {
                                                "id": 4,
                                                "nome": "Ana Sousa"
                                            },
                                            {
                                                "id": 9,
                                                "nome": "Inês Costa"
                                            }
                                        ],
                                        "presencas": [
                                            {
                                                "id": 31,
                                                "utilizador_id": 4,
                                                "nome": "Ana Sousa",
                                                "externo": false,
                                                "consentimento": "dado",
                                                "decidido_em": "2026-10-29T09:01:00+00:00",
                                                "origem": "app"
                                            }
                                        ],
                                        "meu_consentimento": "dado",
                                        "gravacao": {
                                            "pode_gravar": true,
                                            "motivo": null,
                                            "parte_max_mb": 25,
                                            "parte_segundos": 60,
                                            "audio_horas": 48
                                        },
                                        "transcricao": {
                                            "tem": true,
                                            "partes": 3,
                                            "segundos": 182,
                                            "fornecedor": "ollama",
                                            "partes_lista": [
                                                {
                                                    "parte": 1,
                                                    "estado": "transcrito",
                                                    "segundos": 60,
                                                    "audio_apagado": false
                                                }
                                            ]
                                        },
                                        "resumo": {
                                            "texto": "Revisão da agenda da semana…",
                                            "validado": false,
                                            "fornecedor": "ollama"
                                        },
                                        "acoes": [
                                            {
                                                "id": 5,
                                                "ordem": 1,
                                                "texto": "Rever o stock de agulhas",
                                                "responsavel_id": 9,
                                                "responsavel_nome": "Inês Costa",
                                                "prazo": "2026-11-03",
                                                "estado": "proposta",
                                                "tarefa_id": null
                                            }
                                        ],
                                        "assistente": {
                                            "ouvir": true,
                                            "escrever": true
                                        },
                                        "permissoes": {
                                            "gerir": true,
                                            "consentir": true,
                                            "gravar": true,
                                            "resumir": true,
                                            "aprovar_acoes": true,
                                            "ler_transcricao": true
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/reunioes/{id}/transcricao": {
            "get": {
                "tags": [
                    "Reuniões"
                ],
                "operationId": "lerTranscricaoReuniao",
                "summary": "Ler a transcrição",
                "description": "Texto da transcrição (decifrado). Cada leitura fica na auditoria.",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador da reunião"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "texto": {
                                                    "type": "string"
                                                },
                                                "partes": {
                                                    "type": "integer"
                                                },
                                                "segundos": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "texto": "Bom dia a todos…",
                                        "partes": 3,
                                        "segundos": 182
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            },
            "delete": {
                "tags": [
                    "Reuniões"
                ],
                "operationId": "descartarTranscricaoReuniao",
                "summary": "Descartar a transcrição",
                "description": "Apaga o texto e o áudio que ainda exista. O resumo validado e as ações decididas mantêm-se. Só quem organiza ou gere.",
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador da reunião"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/SessaoReuniao"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/simulacoes-ia/{id}/usar": {
            "post": {
                "tags": [
                    "Planos cirúrgicos"
                ],
                "operationId": "simulacaoIaUsar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "editar",
                "summary": "Usar uma simulação validada como a simulação do plano",
                "description": "Só imagens validadas; confere o SHA-256. Repõe «mostrada» e «tomada de conhecimento» (nova apresentação).",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/SimulacaoIaEstado"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/simulacoes-ia/{id}/validar": {
            "post": {
                "tags": [
                    "Planos cirúrgicos"
                ],
                "operationId": "simulacaoIaValidar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "aprovar",
                "summary": "Validar ou rejeitar uma simulação gerada",
                "description": "Só quem aprova planos (médico). Rejeitar exige a nota (guardada cifrada). Com «usar_no_plano», a imagem validada passa logo a ser a simulação do plano.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "decisao": {
                                        "type": "string",
                                        "enum": [
                                            "validar",
                                            "rejeitar"
                                        ]
                                    },
                                    "nota": {
                                        "type": "string"
                                    },
                                    "usar_no_plano": {
                                        "type": "boolean"
                                    }
                                },
                                "required": [
                                    "decisao"
                                ]
                            },
                            "example": {
                                "decisao": "validar",
                                "usar_no_plano": true
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/SimulacaoIaEstado"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/site/analytics": {
            "get": {
                "summary": "Estatísticas do site e decisões de cookies",
                "description": "Medição própria sem cookies: visitas, sessões anónimas (resumo diário cifrado), páginas, origens, campanhas, aparelhos, línguas, conversões e decisões de cookies, com variação face ao período anterior. Máximo de 366 dias; por omissão, os últimos 30.",
                "parameters": [
                    {
                        "name": "de",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "area",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "todas",
                                "site",
                                "apresentacao"
                            ]
                        },
                        "description": "«apresentacao» só tem dados na clínica principal."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/SiteAnalytics"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "periodo": {
                                            "de": "2026-09-29",
                                            "ate": "2026-10-28",
                                            "dias": 30,
                                            "area": "todas"
                                        },
                                        "kpis": {
                                            "visitas": 8421,
                                            "visitas_delta": 12.4,
                                            "sessoes": 3120,
                                            "sessoes_delta": 8.1,
                                            "paginas_por_sessao": 2.7,
                                            "telemovel_pct": 71.3,
                                            "pre_avaliacoes": 46,
                                            "conversao_pct": 1.47,
                                            "aceitacao_cookies_pct": 58.2
                                        },
                                        "serie": [
                                            {
                                                "x": "2026-10-28",
                                                "y": 312,
                                                "serie": "Site da clínica"
                                            }
                                        ],
                                        "paginas": [
                                            {
                                                "caminho": "/procedimentos/fue",
                                                "area": "site",
                                                "visitas": 1204,
                                                "sessoes": 980
                                            }
                                        ],
                                        "origens": [
                                            {
                                                "x": "Pesquisa",
                                                "y": 1480
                                            }
                                        ],
                                        "campanhas": [
                                            {
                                                "campanha": "outono",
                                                "fonte": "newsletter",
                                                "meio": "email",
                                                "visitas": 210
                                            }
                                        ],
                                        "dispositivos": [
                                            {
                                                "x": "telemovel",
                                                "y": 6004
                                            }
                                        ],
                                        "idiomas": [
                                            {
                                                "x": "pt",
                                                "y": 7020
                                            }
                                        ],
                                        "conversoes": {
                                            "pre_avaliacoes": 46,
                                            "leads": 128,
                                            "pedidos_demonstracao": null,
                                            "serie": []
                                        },
                                        "cookies": {
                                            "aceitar": 1210,
                                            "rejeitar": 640,
                                            "personalizar": 229,
                                            "total": 2079,
                                            "taxa_aceitacao": 58.2,
                                            "taxa_rejeicao": 30.8,
                                            "categorias": {
                                                "preferencias": 1390,
                                                "estatistica": 1351,
                                                "marketing": 1262
                                            },
                                            "versao_politica": "2"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Site — analytics"
                ],
                "operationId": "siteAnalytics",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "ver"
            }
        },
        "/site/analytics/ao-vivo": {
            "get": {
                "summary": "Visitas e decisões de cookies ao vivo",
                "description": "Últimos minutos (5 a 1440; omissão 60). Pensado para atualização a cada 15 segundos.",
                "parameters": [
                    {
                        "name": "minutos",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "minimum": 5,
                            "maximum": 1440
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/SiteAoVivo"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "minutos": 60,
                                        "visitas": 84,
                                        "ativos_agora": 6,
                                        "cookies": {
                                            "aceitar": 11,
                                            "rejeitar": 5,
                                            "personalizar": 2,
                                            "total": 18,
                                            "ultimas": [
                                                {
                                                    "id": 20931,
                                                    "decisao": "aceitar",
                                                    "categorias": [
                                                        "preferencias",
                                                        "estatistica",
                                                        "marketing"
                                                    ],
                                                    "em": "2026-10-28T11:41:07+00:00"
                                                }
                                            ]
                                        },
                                        "em": "2026-10-28T11:41:20+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Site — analytics"
                ],
                "operationId": "siteAnalyticsAoVivo",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "ver"
            }
        },
        "/site/cms/blocos": {
            "get": {
                "summary": "Blocos editáveis de uma página",
                "description": "Catálogo e valores gravados, pela ordem da página. A página «apresentacao» é recusada (403): é gerida na área da plataforma.",
                "parameters": [
                    {
                        "name": "pagina",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^[a-z][a-z0-9_]{0,79}$"
                        }
                    },
                    {
                        "name": "idioma",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "pt",
                                "en"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/SiteBloco"
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "pagina": {
                                                    "type": "string"
                                                },
                                                "idioma": {
                                                    "type": "string"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 214,
                                            "pagina": "inicio",
                                            "chave": "hero_titulo",
                                            "idioma": "pt",
                                            "tipo": "texto",
                                            "seccao": "hero",
                                            "rotulo": "Título principal",
                                            "ajuda": "Use *asteriscos* para o itálico.",
                                            "valor": "Cabelo natural, *plano transparente*.",
                                            "campos": null,
                                            "imagem": null,
                                            "personalizado": true,
                                            "atualizado_em": "2026-10-28 11:20:00",
                                            "ordem": 1
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Site — CMS"
                ],
                "operationId": "siteCmsBlocos",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "ver"
            },
            "put": {
                "summary": "Gravar um bloco",
                "description": "Valida por tipo: texto até 500 caracteres; texto longo até 12 000; HTML sanitizado por lista de etiquetas; ligação com https://, mailto:, tel: ou caminho do site; lista até 200 itens; imagem com ficheiro_id da biblioteca. Alteração auditada; o site atualiza-se de imediato.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "pagina": {
                                        "type": "string"
                                    },
                                    "chave": {
                                        "type": "string"
                                    },
                                    "idioma": {
                                        "type": "string",
                                        "enum": [
                                            "pt",
                                            "en"
                                        ]
                                    },
                                    "valor": {
                                        "description": "Conforme o tipo do bloco."
                                    },
                                    "ficheiro_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "pagina",
                                    "chave",
                                    "idioma"
                                ]
                            },
                            "example": {
                                "pagina": "inicio",
                                "chave": "hero_titulo",
                                "idioma": "pt",
                                "valor": "Cabelo natural, *plano transparente*."
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/SiteBloco"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 214,
                                        "pagina": "inicio",
                                        "chave": "hero_titulo",
                                        "idioma": "pt",
                                        "tipo": "texto",
                                        "seccao": "hero",
                                        "rotulo": "Título principal",
                                        "ajuda": "Use *asteriscos* para o itálico.",
                                        "valor": "Cabelo natural, *plano transparente*.",
                                        "campos": null,
                                        "imagem": null,
                                        "personalizado": true,
                                        "atualizado_em": "2026-10-28 11:20:00",
                                        "ordem": 1
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Site — CMS"
                ],
                "operationId": "siteCmsGuardarBloco",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "editar"
            }
        },
        "/site/cms/blocos/repor": {
            "post": {
                "summary": "Repor o texto original de um bloco",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "pagina": {
                                        "type": "string"
                                    },
                                    "chave": {
                                        "type": "string"
                                    },
                                    "idioma": {
                                        "type": "string",
                                        "enum": [
                                            "pt",
                                            "en"
                                        ]
                                    }
                                },
                                "required": [
                                    "pagina",
                                    "chave",
                                    "idioma"
                                ]
                            },
                            "example": {
                                "pagina": "inicio",
                                "chave": "hero_titulo",
                                "idioma": "pt"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/SiteBloco"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 214,
                                        "pagina": "inicio",
                                        "chave": "hero_titulo",
                                        "idioma": "pt",
                                        "tipo": "texto",
                                        "seccao": "hero",
                                        "rotulo": "Título principal",
                                        "ajuda": "Use *asteriscos* para o itálico.",
                                        "valor": "Cirurgia capilar com *planeamento transparente*.",
                                        "campos": null,
                                        "imagem": null,
                                        "personalizado": false,
                                        "atualizado_em": "2026-10-28 11:20:00",
                                        "ordem": 1
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Site — CMS"
                ],
                "operationId": "siteCmsReporBloco",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "editar"
            }
        },
        "/site/cms/imagens": {
            "get": {
                "summary": "Biblioteca de imagens do site",
                "parameters": [
                    {
                        "name": "q",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "maxLength": 100
                        },
                        "description": "Procura no nome e nas descrições."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/SiteImagem"
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 37,
                                            "nome": "9f1c2a7e4b0d4c1e8a3f6b2d5c7e9a10.webp",
                                            "url": "https://clinica.exemplo.pt/uploads/site/c1/9f1c2a7e4b0d4c1e8a3f6b2d5c7e9a10.webp",
                                            "mime": "image/webp",
                                            "largura": 2400,
                                            "altura": 1600,
                                            "tamanho": 318422,
                                            "alt_pt": "Sala de consulta da clínica",
                                            "alt_en": "The clinic's consultation room",
                                            "usos": 2,
                                            "criado_em": "2026-10-28T09:12:00+00:00"
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Site — CMS"
                ],
                "operationId": "siteCmsImagens",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "ver"
            },
            "post": {
                "summary": "Carregar uma imagem",
                "description": "Multipart. Só JPEG, PNG, WebP ou GIF verificados pelos bytes e pelas dimensões; reescrita sem metadados (máx. 2400 px), nome aleatório, pasta pública sem execução. Limite: 60 por 10 minutos.",
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ficheiro"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary"
                                    },
                                    "alt_pt": {
                                        "type": "string",
                                        "maxLength": 255
                                    },
                                    "alt_en": {
                                        "type": "string",
                                        "maxLength": 255
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/SiteImagem"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 37,
                                        "nome": "9f1c2a7e4b0d4c1e8a3f6b2d5c7e9a10.webp",
                                        "url": "https://clinica.exemplo.pt/uploads/site/c1/9f1c2a7e4b0d4c1e8a3f6b2d5c7e9a10.webp",
                                        "mime": "image/webp",
                                        "largura": 2400,
                                        "altura": 1600,
                                        "tamanho": 318422,
                                        "alt_pt": "Sala de consulta da clínica",
                                        "alt_en": "The clinic's consultation room",
                                        "usos": 2,
                                        "criado_em": "2026-10-28T09:12:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Site — CMS"
                ],
                "operationId": "siteCmsCarregarImagem",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "editar"
            }
        },
        "/site/cms/imagens/{id}": {
            "put": {
                "summary": "Alterar as descrições de uma imagem",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Identificador"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "alt_pt": {
                                        "type": "string",
                                        "maxLength": 255
                                    },
                                    "alt_en": {
                                        "type": "string",
                                        "maxLength": 255
                                    }
                                }
                            },
                            "example": {
                                "alt_pt": "Sala de consulta",
                                "alt_en": "Consultation room"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/SiteImagem"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 37,
                                        "nome": "9f1c2a7e4b0d4c1e8a3f6b2d5c7e9a10.webp",
                                        "url": "https://clinica.exemplo.pt/uploads/site/c1/9f1c2a7e4b0d4c1e8a3f6b2d5c7e9a10.webp",
                                        "mime": "image/webp",
                                        "largura": 2400,
                                        "altura": 1600,
                                        "tamanho": 318422,
                                        "alt_pt": "Sala de consulta da clínica",
                                        "alt_en": "The clinic's consultation room",
                                        "usos": 2,
                                        "criado_em": "2026-10-28T09:12:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Site — CMS"
                ],
                "operationId": "siteCmsDescricaoImagem",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "editar"
            },
            "delete": {
                "summary": "Apagar uma imagem sem utilizações",
                "description": "Recusado (422) se a imagem estiver em uso num bloco ou página.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Identificador"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "apagada": {
                                                    "type": "boolean"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 37,
                                        "apagada": true
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Site — CMS"
                ],
                "operationId": "siteCmsApagarImagem",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "editar"
            }
        },
        "/site/cms/paginas": {
            "get": {
                "summary": "Páginas do site da clínica",
                "description": "Todas as páginas da clínica atual com o estado por língua e o número de blocos personalizados.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/SitePaginaEditor"
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "chave": "inicio",
                                            "tipo": "institucional",
                                            "ordem": 0,
                                            "idiomas": {
                                                "pt": {
                                                    "id": 1,
                                                    "titulo": "Início",
                                                    "slug": "inicio",
                                                    "publicada": true,
                                                    "versao": 3,
                                                    "publicada_em": "2026-10-28 10:00:00",
                                                    "atualizado_em": "2026-10-28 10:00:00"
                                                }
                                            },
                                            "blocos": 24,
                                            "personalizados": {
                                                "pt": 6,
                                                "en": 2
                                            },
                                            "url": "https://clinica.exemplo.pt/"
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Site — CMS"
                ],
                "operationId": "siteCmsPaginas",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "ver"
            }
        },
        "/site/cms/paginas/{id}/publicar": {
            "post": {
                "summary": "Publicar ou retirar uma página",
                "description": "publicar = true (omissão) publica; false retira do site. Com conteúdo novo, cria uma versão imutável com impressão digital (SHA-256). Publicar a Política de Cookies sobe a versão da política e o banner volta a pedir a decisão.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Identificador"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "publicar": {
                                        "type": "boolean"
                                    },
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "maxLength": 255
                                    }
                                }
                            },
                            "example": {
                                "publicar": true,
                                "motivo": "Atualização dos dados do encarregado de proteção de dados"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "publicada": {
                                                    "type": "boolean"
                                                },
                                                "versao": {
                                                    "type": "integer"
                                                },
                                                "publicada_em": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date-time"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 12,
                                        "publicada": true,
                                        "versao": 4,
                                        "publicada_em": "2026-10-28T11:30:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Site — CMS"
                ],
                "operationId": "siteCmsPublicar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "editar"
            }
        },
        "/site/cms/paginas/{id}/versoes": {
            "get": {
                "summary": "Versões publicadas de uma página",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Identificador"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/SiteVersao"
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 33,
                                            "versao": 4,
                                            "titulo": "Política de Privacidade",
                                            "conteudo_hash": "5b0e1f…c2a9",
                                            "motivo": "Atualização dos dados do encarregado de proteção de dados",
                                            "criado_por": 3,
                                            "criado_em": "2026-10-28T11:30:00+00:00"
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Site — CMS"
                ],
                "operationId": "siteCmsVersoes",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "ver"
            }
        },
        "/site/incorporacao": {
            "get": {
                "summary": "Pré-avaliação noutros sites: estado e código",
                "description": "Sites autorizados, a linha de código para colar (português, inglês e com contentor) e os endereços da página incorporada e da pré-visualização. A página incorporada só se deixa emoldurar pelos sites autorizados (frame-ancestors) e só envia mensagens de altura para a origem validada.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/SiteIncorporacao"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ativa": true,
                                        "ligada": true,
                                        "pre_avaliacao_ativa": true,
                                        "dominios": [
                                            "https://www.clinica.pt"
                                        ],
                                        "invalidos": [],
                                        "codigo_clinica": "PORTO-HAIR",
                                        "url_script": "https://plataforma.exemplo.pt/assets/ax/js/incorporar-pre-avaliacao.js",
                                        "url_pagina": "https://plataforma.exemplo.pt/incorporar/pre-avaliacao?idioma=pt&clinica=PORTO-HAIR",
                                        "codigo": "<script src=\"https://plataforma.exemplo.pt/assets/ax/js/incorporar-pre-avaliacao.js\" data-anagen-pre-avaliacao data-clinica=\"PORTO-HAIR\" data-idioma=\"pt\" async></script>"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Site — incorporação"
                ],
                "operationId": "siteIncorporacao",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "ver"
            },
            "put": {
                "summary": "Ligar e autorizar sites",
                "description": "ativa liga a incorporação (exige pelo menos um site); dominios aceita https://dominio, dominio ou *.dominio (até 20). Um endereço inválido recusa o pedido (422). Alteração auditada.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "ativa": {
                                        "type": "boolean"
                                    },
                                    "dominios": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        }
                                    }
                                },
                                "required": [
                                    "ativa",
                                    "dominios"
                                ]
                            },
                            "example": {
                                "ativa": true,
                                "dominios": [
                                    "https://www.clinica.pt",
                                    "*.clinica.pt"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/SiteIncorporacao"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ativa": true,
                                        "ligada": true,
                                        "dominios": [
                                            "https://www.clinica.pt",
                                            "https://*.clinica.pt"
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Site — incorporação"
                ],
                "operationId": "siteIncorporacaoGravar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "site.cms",
                "x-anagen-nivel": "editar"
            }
        },
        "/site/pre-avaliacoes/{id}": {
            "get": {
                "summary": "Pré-avaliação para revisão",
                "description": "A lista, os filtros e a exportação vêm do recurso genérico pre_avaliacoes (/r/pre_avaliacoes). Este detalhe junta as fotografias (ficha.fotografias, ligações de 30 min) e as respostas, a triagem e a nota médica (ficha.clinica). A primeira abertura por quem pode rever passa o estado a «em_revisao». Leitura auditada.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Identificador"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PreAvaliacaoDetalhe"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 91,
                                        "nome": "João Costa",
                                        "email": "joao.costa@exemplo.pt",
                                        "telefone": "+351 913 222 111",
                                        "pais": "PT",
                                        "lead_id": 402,
                                        "idioma": "pt",
                                        "origem": "app",
                                        "estado": "em_revisao",
                                        "estado_rotulo": "Em revisão",
                                        "procedimento": "couro_cabeludo",
                                        "procedimento_rotulo": "Couro cabeludo",
                                        "triagem": "elegivel_provavel",
                                        "triagem_rotulo": "Seguir para consulta",
                                        "parecer": null,
                                        "parecer_rotulo": null,
                                        "nota_medica": null,
                                        "consentimentos": {
                                            "tratamento_clinico": true,
                                            "fotografias_clinicas": true,
                                            "contacto": true,
                                            "marketing": false
                                        },
                                        "fotos": [
                                            {
                                                "ficheiro_id": 8801,
                                                "vista": "frontal",
                                                "url": "https://clinica.exemplo.pt/f/eyJmIjo4ODAxLC….a9c"
                                            }
                                        ],
                                        "respostas": [
                                            {
                                                "chave": "tempo_queda",
                                                "rotulo": "Há quanto tempo nota a queda?",
                                                "valor": "3 a 5 anos"
                                            }
                                        ],
                                        "revisto_por": null,
                                        "revisto_em": null,
                                        "respondido_em": null,
                                        "criado_em": "2026-10-28T08:05:00+00:00",
                                        "pode": {
                                            "rever": true,
                                            "responder": false,
                                            "fotos": true,
                                            "respostas": true
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Site — pré-avaliações"
                ],
                "operationId": "sitePreAvaliacaoDetalhe",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "ver"
            }
        },
        "/site/pre-avaliacoes/{id}/resposta": {
            "post": {
                "summary": "Enviar a resposta ao interessado",
                "description": "Exige crm.atendimento (editar) e o estado «revista» (422 antes da revisão médica). Envia o email com o próximo passo adequado ao parecer, sem pormenores clínicos, e passa a «respondida».",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Identificador"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "mensagem": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "maxLength": 2000
                                    }
                                }
                            },
                            "example": {
                                "mensagem": "Temos vagas na próxima semana, de manhã."
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PreAvaliacaoDetalhe"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 91,
                                        "nome": "João Costa",
                                        "email": "joao.costa@exemplo.pt",
                                        "telefone": "+351 913 222 111",
                                        "pais": "PT",
                                        "lead_id": 402,
                                        "idioma": "pt",
                                        "origem": "app",
                                        "estado": "respondida",
                                        "estado_rotulo": "Respondida",
                                        "procedimento": "couro_cabeludo",
                                        "procedimento_rotulo": "Couro cabeludo",
                                        "triagem": "elegivel_provavel",
                                        "triagem_rotulo": "Seguir para consulta",
                                        "parecer": null,
                                        "parecer_rotulo": null,
                                        "nota_medica": null,
                                        "consentimentos": {
                                            "tratamento_clinico": true,
                                            "fotografias_clinicas": true,
                                            "contacto": true,
                                            "marketing": false
                                        },
                                        "fotos": [
                                            {
                                                "ficheiro_id": 8801,
                                                "vista": "frontal",
                                                "url": "https://clinica.exemplo.pt/f/eyJmIjo4ODAxLC….a9c"
                                            }
                                        ],
                                        "respostas": [
                                            {
                                                "chave": "tempo_queda",
                                                "rotulo": "Há quanto tempo nota a queda?",
                                                "valor": "3 a 5 anos"
                                            }
                                        ],
                                        "revisto_por": null,
                                        "revisto_em": null,
                                        "respondido_em": "2026-10-28T12:30:00+00:00",
                                        "criado_em": "2026-10-28T08:05:00+00:00",
                                        "pode": {
                                            "rever": true,
                                            "responder": false,
                                            "fotos": true,
                                            "respostas": true
                                        },
                                        "email_enviado": true
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Site — pré-avaliações"
                ],
                "operationId": "sitePreAvaliacaoResposta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-nivel": "editar"
            }
        },
        "/site/pre-avaliacoes/{id}/revista": {
            "post": {
                "summary": "Revisão médica",
                "description": "Exige ficha.clinica (editar). Grava o parecer e a nota médica (cifrada), conclui a tarefa de revisão, valida a resposta do formulário clínico e avisa a receção (sem conteúdo clínico).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Identificador"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "parecer": {
                                        "type": "string",
                                        "enum": [
                                            "consulta",
                                            "teleconsulta",
                                            "mais_fotos",
                                            "nao_elegivel",
                                            "outro"
                                        ]
                                    },
                                    "nota": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "maxLength": 4000
                                    }
                                },
                                "required": [
                                    "parecer"
                                ]
                            },
                            "example": {
                                "parecer": "consulta",
                                "nota": "Boa zona dadora; avaliar a coroa em consulta."
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/PreAvaliacaoDetalhe"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 91,
                                        "nome": "João Costa",
                                        "email": "joao.costa@exemplo.pt",
                                        "telefone": "+351 913 222 111",
                                        "pais": "PT",
                                        "lead_id": 402,
                                        "idioma": "pt",
                                        "origem": "app",
                                        "estado": "revista",
                                        "estado_rotulo": "Revista",
                                        "procedimento": "couro_cabeludo",
                                        "procedimento_rotulo": "Couro cabeludo",
                                        "triagem": "elegivel_provavel",
                                        "triagem_rotulo": "Seguir para consulta",
                                        "parecer": "consulta",
                                        "parecer_rotulo": "Marcar consulta presencial",
                                        "nota_medica": null,
                                        "consentimentos": {
                                            "tratamento_clinico": true,
                                            "fotografias_clinicas": true,
                                            "contacto": true,
                                            "marketing": false
                                        },
                                        "fotos": [
                                            {
                                                "ficheiro_id": 8801,
                                                "vista": "frontal",
                                                "url": "https://clinica.exemplo.pt/f/eyJmIjo4ODAxLC….a9c"
                                            }
                                        ],
                                        "respostas": [
                                            {
                                                "chave": "tempo_queda",
                                                "rotulo": "Há quanto tempo nota a queda?",
                                                "valor": "3 a 5 anos"
                                            }
                                        ],
                                        "revisto_por": 7,
                                        "revisto_em": "2026-10-28T12:02:00+00:00",
                                        "respondido_em": null,
                                        "criado_em": "2026-10-28T08:05:00+00:00",
                                        "pode": {
                                            "rever": true,
                                            "responder": false,
                                            "fotos": true,
                                            "respostas": true
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                },
                "tags": [
                    "Site — pré-avaliações"
                ],
                "operationId": "sitePreAvaliacaoRevista",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar"
            }
        },
        "/stock/alertas": {
            "get": {
                "tags": [
                    "Stock"
                ],
                "operationId": "m5StockAlertas",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "ver",
                "summary": "Alertas de stock",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "abaixo_minimo": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "id": {
                                                                "type": "integer"
                                                            },
                                                            "nome": {
                                                                "type": "string"
                                                            },
                                                            "referencia": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            },
                                                            "categoria": {
                                                                "type": "string"
                                                            },
                                                            "unidade": {
                                                                "type": "string"
                                                            },
                                                            "stock_atual": {
                                                                "type": "number"
                                                            },
                                                            "stock_minimo": {
                                                                "type": "number"
                                                            },
                                                            "fornecedor": {
                                                                "type": [
                                                                    "string",
                                                                    "null"
                                                                ]
                                                            }
                                                        }
                                                    }
                                                },
                                                "validades": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object",
                                                        "properties": {
                                                            "artigo_id": {
                                                                "type": "integer"
                                                            },
                                                            "artigo": {
                                                                "type": "string"
                                                            },
                                                            "lote": {
                                                                "type": "string"
                                                            },
                                                            "validade": {
                                                                "type": "string",
                                                                "format": "date"
                                                            },
                                                            "quantidade": {
                                                                "type": "number"
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/stock/cirurgias/{id}/consumos": {
            "get": {
                "tags": [
                    "Stock"
                ],
                "operationId": "m5ConsumosCirurgia",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "ver",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Consumos de uma cirurgia",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/M5Consumo"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            },
            "post": {
                "tags": [
                    "Stock"
                ],
                "operationId": "m5ConsumosRegistar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "stock:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "stock",
                "x-anagen-nivel": "editar",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "summary": "Registar consumos (Consumos::registarCirurgia)",
                "description": "Idempotente por cirurgia: substitui os consumos ainda não lançados. Exige lote nos artigos com lote obrigatório. Efeitos: saídas de stock do tipo consumo, ligadas à cirurgia e ao paciente, alertas de mínimo.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "linhas": {
                                        "type": "array",
                                        "items": {
                                            "type": "object",
                                            "required": [
                                                "artigo_id",
                                                "quantidade"
                                            ],
                                            "properties": {
                                                "artigo_id": {
                                                    "type": "integer"
                                                },
                                                "quantidade": {
                                                    "type": "number"
                                                },
                                                "lote": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "validade": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ],
                                                    "format": "date"
                                                },
                                                "notas": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        }
                                    }
                                },
                                "required": [
                                    "linhas"
                                ]
                            },
                            "example": {
                                "linhas": [
                                    {
                                        "artigo_id": 5,
                                        "quantidade": 2,
                                        "lote": "L2611A",
                                        "validade": "2027-05-31"
                                    }
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/M5Consumo"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/subscricao/confirmar/{codigo}": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "get": {
                "tags": [
                    "Chat do site e subscrições"
                ],
                "operationId": "subscricaoConfirmar",
                "security": [],
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "publico",
                "summary": "Confirmar a adesão (dupla adesão)",
                "description": "Ligação do email «Confirme a sua adesão». Regista o consentimento de marketing com data e origem e marca a adesão como confirmada. Código de uso único.",
                "parameters": [
                    {
                        "name": "codigo",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^[A-Za-z0-9_-]{16,128}$"
                        },
                        "description": "Código de confirmação"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de confirmação",
                        "content": {
                            "text/html": {
                                "schema": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/subscricao/{codigo}": {
            "servers": [
                {
                    "url": "https://anagen.pt",
                    "description": "Raiz do site da clínica (fora de /api/v1)"
                }
            ],
            "get": {
                "tags": [
                    "Chat do site e subscrições"
                ],
                "operationId": "subscricaoPagina",
                "security": [],
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "publico",
                "summary": "Página «Deixar de receber»",
                "description": "Página HTML com a confirmação da anulação. A clínica e o contacto vêm do registo do envio.",
                "parameters": [
                    {
                        "name": "codigo",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^[A-Za-z0-9_-]{16,128}$"
                        },
                        "description": "Código do envio"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página",
                        "content": {
                            "text/html": {
                                "schema": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            },
            "post": {
                "tags": [
                    "Chat do site e subscrições"
                ],
                "operationId": "subscricaoAnular",
                "security": [],
                "x-anagen-modulo": "marketing",
                "x-anagen-nivel": "publico",
                "summary": "Confirmar «Deixar de receber»",
                "description": "Formulário da página (com o código CSRF). Efeitos: lista de oposição do canal, consentimento de marketing revogado, sequências comerciais paradas, contagem de anulações.",
                "parameters": [
                    {
                        "name": "codigo",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^[A-Za-z0-9_-]{16,128}$"
                        },
                        "description": "Código do envio"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de confirmação",
                        "content": {
                            "text/html": {
                                "schema": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/tarefas": {
            "get": {
                "tags": [
                    "Tarefas"
                ],
                "operationId": "listarTarefas",
                "summary": "Tarefas por vista",
                "description": "Vistas: minhas (agrupadas em atraso, hoje, próximas, sem prazo), equipa (âmbito da matriz), quadro (aberta, em curso, concluída nos últimos 7 dias) e concluidas.\n\nÂmbito equipa.tarefas: «próprios» = as minhas, do meu departamento sem responsável e as que criei; «equipa» acrescenta as das minhas equipas; «todos» = clínica inteira. Nomes de paciente, lead e cirurgia só para quem pode ver esses módulos.",
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.tarefas:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "vista",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "minhas",
                                "equipa",
                                "quadro",
                                "concluidas"
                            ],
                            "default": "minhas"
                        },
                        "description": "Vista."
                    },
                    {
                        "name": "q",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Pesquisa no título e na descrição."
                    },
                    {
                        "name": "prioridade",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "baixa",
                                "normal",
                                "alta",
                                "urgente"
                            ]
                        },
                        "description": "Prioridade."
                    },
                    {
                        "name": "origem",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "manual",
                                "automatica",
                                "mensagem",
                                "agente"
                            ]
                        },
                        "description": "Origem."
                    },
                    {
                        "name": "responsavel_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Responsável."
                    },
                    {
                        "name": "paciente_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Paciente."
                    },
                    {
                        "name": "lead_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Lead."
                    },
                    {
                        "name": "cirurgia_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Cirurgia."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/ListaTarefas"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "vista": "minhas",
                                        "grupos": [
                                            {
                                                "chave": "hoje",
                                                "titulo": "Hoje",
                                                "tom": "marca",
                                                "tarefas": [
                                                    {
                                                        "id": 87,
                                                        "titulo": "Ligar à Rita Matos para confirmar a consulta",
                                                        "descricao": null,
                                                        "tipo": "geral",
                                                        "prioridade": "alta",
                                                        "prioridade_rotulo": "Alta",
                                                        "estado": "aberta",
                                                        "estado_rotulo": "Aberta",
                                                        "origem": "manual",
                                                        "origem_rotulo": "Manual",
                                                        "prazo": "2026-10-29T10:00:00+00:00",
                                                        "em_atraso": false,
                                                        "responsavel_id": 4,
                                                        "responsavel_nome": "Ana Sousa",
                                                        "paciente_id": 41,
                                                        "paciente_nome": "Rita Matos",
                                                        "lead_id": null,
                                                        "cirurgia_id": null,
                                                        "checklist": {
                                                            "total": 3,
                                                            "feitos": 1
                                                        },
                                                        "itens": [
                                                            {
                                                                "id": 5,
                                                                "texto": "Confirmar morada",
                                                                "feito": true,
                                                                "obrigatorio": false,
                                                                "responsavel_nome": null
                                                            }
                                                        ],
                                                        "criado_em": "2026-10-28T09:12:00+00:00"
                                                    }
                                                ]
                                            }
                                        ],
                                        "total": 1,
                                        "contagens": {
                                            "hoje": 1,
                                            "atraso": 0,
                                            "abertas": 4,
                                            "equipa": 12
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            },
            "post": {
                "tags": [
                    "Tarefas"
                ],
                "operationId": "criarTarefa",
                "summary": "Criar tarefa (com checklist)",
                "description": "Criação rápida: o título entende «!urgente|!alta|!baixa» (prioridade), «hoje»/«amanhã» (prazo às 18:00) e «@Nome» (responsável). Sem responsável nem departamento, a tarefa fica para quem a cria. O responsável (ou o departamento) é notificado.\n\nEfeitos: webhook tarefa.criada; auditoria.",
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.tarefas:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/NovaTarefa"
                            },
                            "example": {
                                "titulo": "Pedir análises pré-operatórias amanhã !alta",
                                "responsavel_id": 4,
                                "paciente_id": 41,
                                "itens": [
                                    "Hemograma",
                                    "Coagulação",
                                    "ECG"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Tarefa"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 87,
                                        "titulo": "Ligar à Rita Matos para confirmar a consulta",
                                        "descricao": null,
                                        "tipo": "geral",
                                        "prioridade": "alta",
                                        "prioridade_rotulo": "Alta",
                                        "estado": "aberta",
                                        "estado_rotulo": "Aberta",
                                        "origem": "manual",
                                        "origem_rotulo": "Manual",
                                        "prazo": "2026-10-29T10:00:00+00:00",
                                        "em_atraso": false,
                                        "responsavel_id": 4,
                                        "responsavel_nome": "Ana Sousa",
                                        "paciente_id": 41,
                                        "paciente_nome": "Rita Matos",
                                        "lead_id": null,
                                        "cirurgia_id": null,
                                        "checklist": {
                                            "total": 3,
                                            "feitos": 1
                                        },
                                        "itens": [
                                            {
                                                "id": 5,
                                                "texto": "Confirmar morada",
                                                "feito": true,
                                                "obrigatorio": false,
                                                "responsavel_nome": null
                                            }
                                        ],
                                        "criado_em": "2026-10-28T09:12:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/tarefas/contagens": {
            "get": {
                "tags": [
                    "Tarefas"
                ],
                "operationId": "contarTarefas",
                "summary": "Contagens (hoje, em atraso, abertas, equipa)",
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.tarefas:ver"
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "hoje": {
                                                    "type": "integer"
                                                },
                                                "atraso": {
                                                    "type": "integer"
                                                },
                                                "abertas": {
                                                    "type": "integer"
                                                },
                                                "equipa": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "hoje": 3,
                                        "atraso": 1,
                                        "abertas": 9,
                                        "equipa": 27
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/tarefas/{id}": {
            "get": {
                "tags": [
                    "Tarefas"
                ],
                "operationId": "obterTarefa",
                "summary": "Obter tarefa com checklist",
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.tarefas:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Tarefa"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 87,
                                        "titulo": "Ligar à Rita Matos para confirmar a consulta",
                                        "descricao": null,
                                        "tipo": "geral",
                                        "prioridade": "alta",
                                        "prioridade_rotulo": "Alta",
                                        "estado": "aberta",
                                        "estado_rotulo": "Aberta",
                                        "origem": "manual",
                                        "origem_rotulo": "Manual",
                                        "prazo": "2026-10-29T10:00:00+00:00",
                                        "em_atraso": false,
                                        "responsavel_id": 4,
                                        "responsavel_nome": "Ana Sousa",
                                        "paciente_id": 41,
                                        "paciente_nome": "Rita Matos",
                                        "lead_id": null,
                                        "cirurgia_id": null,
                                        "checklist": {
                                            "total": 3,
                                            "feitos": 1
                                        },
                                        "itens": [
                                            {
                                                "id": 5,
                                                "texto": "Confirmar morada",
                                                "feito": true,
                                                "obrigatorio": false,
                                                "responsavel_nome": null
                                            }
                                        ],
                                        "criado_em": "2026-10-28T09:12:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            },
            "put": {
                "tags": [
                    "Tarefas"
                ],
                "operationId": "alterarTarefa",
                "summary": "Alterar tarefa",
                "description": "Alteração parcial (só os campos enviados). «estado» aceita aberta, em_curso ou cancelada; para concluir use /concluir. Mudar o responsável notifica a nova pessoa.",
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.tarefas:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/AlterarTarefa"
                            },
                            "example": {
                                "prazo": "2026-10-30T12:00:00+00:00",
                                "estado": "em_curso"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Tarefa"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 87,
                                        "titulo": "Ligar à Rita Matos para confirmar a consulta",
                                        "descricao": null,
                                        "tipo": "geral",
                                        "prioridade": "alta",
                                        "prioridade_rotulo": "Alta",
                                        "estado": "aberta",
                                        "estado_rotulo": "Aberta",
                                        "origem": "manual",
                                        "origem_rotulo": "Manual",
                                        "prazo": "2026-10-29T10:00:00+00:00",
                                        "em_atraso": false,
                                        "responsavel_id": 4,
                                        "responsavel_nome": "Ana Sousa",
                                        "paciente_id": 41,
                                        "paciente_nome": "Rita Matos",
                                        "lead_id": null,
                                        "cirurgia_id": null,
                                        "checklist": {
                                            "total": 3,
                                            "feitos": 1
                                        },
                                        "itens": [
                                            {
                                                "id": 5,
                                                "texto": "Confirmar morada",
                                                "feito": true,
                                                "obrigatorio": false,
                                                "responsavel_nome": null
                                            }
                                        ],
                                        "criado_em": "2026-10-28T09:12:00+00:00"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/tarefas/{id}/concluir": {
            "post": {
                "tags": [
                    "Tarefas"
                ],
                "operationId": "concluirTarefa",
                "summary": "Concluir tarefa",
                "description": "Recusa (422) se houver itens obrigatórios da checklist por fazer. Efeitos: webhook tarefa.concluida; auditoria. Desfazer: /reabrir.",
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.tarefas:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Tarefa"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/tarefas/{id}/itens": {
            "post": {
                "tags": [
                    "Tarefas"
                ],
                "operationId": "acrescentarItemDaChecklist",
                "summary": "Acrescentar item à checklist",
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.tarefas:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "texto"
                                ],
                                "properties": {
                                    "texto": {
                                        "type": "string",
                                        "maxLength": 255
                                    },
                                    "responsavel_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    },
                                    "obrigatorio": {
                                        "type": "boolean"
                                    }
                                }
                            },
                            "example": {
                                "texto": "Confirmar jejum de 6 h",
                                "responsavel_id": 9,
                                "obrigatorio": true
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/ItemChecklist"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/tarefas/{id}/itens/ordem": {
            "put": {
                "tags": [
                    "Tarefas"
                ],
                "operationId": "ordenarItensDaChecklist",
                "summary": "Reordenar a checklist",
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.tarefas:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ids"
                                ],
                                "properties": {
                                    "ids": {
                                        "type": "array",
                                        "items": {
                                            "type": "integer"
                                        }
                                    }
                                }
                            },
                            "example": {
                                "ids": [
                                    7,
                                    5,
                                    6
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/ItemChecklist"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/tarefas/{id}/itens/{item}": {
            "delete": {
                "tags": [
                    "Tarefas"
                ],
                "operationId": "retirarItemDaChecklist",
                "summary": "Retirar item",
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.tarefas:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    },
                    {
                        "name": "item",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Item da checklist"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/ItemChecklist"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/tarefas/{id}/itens/{item}/alternar": {
            "post": {
                "tags": [
                    "Tarefas"
                ],
                "operationId": "alternarItemDaChecklist",
                "summary": "Marcar/desmarcar item",
                "description": "Sem corpo alterna; com {\"feito\": true|false} define. Regista quem e quando.",
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.tarefas:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    },
                    {
                        "name": "item",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Item da checklist"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/ItemChecklist"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/tarefas/{id}/mover": {
            "post": {
                "tags": [
                    "Tarefas"
                ],
                "operationId": "moverTarefa",
                "summary": "Mudar de coluna no quadro",
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.tarefas:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "estado"
                                ],
                                "properties": {
                                    "estado": {
                                        "type": "string",
                                        "enum": [
                                            "aberta",
                                            "em_curso",
                                            "concluida"
                                        ]
                                    }
                                }
                            },
                            "example": {
                                "estado": "em_curso"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Tarefa"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/tarefas/{id}/reabrir": {
            "post": {
                "tags": [
                    "Tarefas"
                ],
                "operationId": "reabrirTarefa",
                "summary": "Reabrir tarefa (desfazer)",
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "equipa.tarefas:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/Tarefa"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/teleconsultas": {
            "get": {
                "tags": [
                    "Teleconsulta"
                ],
                "operationId": "m6ListarTeleconsultas",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-nivel": "ver",
                "summary": "Teleconsultas de um dia ou intervalo",
                "description": "No âmbito do módulo «teleconsulta» (médico: as suas e as dos seus pacientes), excluindo marcações canceladas ou remarcadas, por hora (até 200). «relatorio_ok» indica se já há relatório, sem o mostrar.",
                "parameters": [
                    {
                        "name": "data",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Dia (por omissão hoje)."
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Último dia do intervalo (opcional)."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/M6TeleconsultaLinha"
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "total": {
                                                    "type": "integer"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 55,
                                            "marcacao_id": 8850,
                                            "paciente_id": 1204,
                                            "paciente_nome": "Rui Almeida",
                                            "medico_id": 7,
                                            "medico_nome": "Inês Valente",
                                            "inicio": "2026-11-04T18:00:00+00:00",
                                            "fim": "2026-11-04T18:30:00+00:00",
                                            "estado": "sala_espera",
                                            "estado_rotulo": "Na sala de espera",
                                            "estado_tom": "aviso",
                                            "sala_espera_em": "2026-11-04T17:56:10+00:00",
                                            "relatorio_ok": false
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/teleconsultas/{id}": {
            "get": {
                "tags": [
                    "Teleconsulta"
                ],
                "operationId": "m6ObterTeleconsulta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-nivel": "ver",
                "summary": "Detalhe da teleconsulta",
                "description": "Estado, passos (consentimento, sala de espera, admissão, identidade, presentes, relatório, fecho), consentimentos válidos, presentes, endereço do anfitrião da sala de vídeo (só para quem pode conduzir a sessão), capturas, ficheiros do relatório e do comprovativo e o texto do consentimento aprovado da clínica para ler ao paciente. O relatório e as capturas só saem para quem tem acesso à ficha clínica do paciente («ficha.clinica»), com a leitura auditada.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da teleconsulta"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "allOf": [
                                                {
                                                    "$ref": "#/components/schemas/M6Teleconsulta"
                                                },
                                                {
                                                    "type": "object",
                                                    "properties": {
                                                        "consentimento_texto": {
                                                            "type": [
                                                                "object",
                                                                "null"
                                                            ],
                                                            "properties": {
                                                                "titulo": {
                                                                    "type": "string"
                                                                },
                                                                "texto": {
                                                                    "type": "string",
                                                                    "description": "HTML do modelo aprovado."
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            ]
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 55,
                                        "marcacao_id": 8850,
                                        "estado": "em_curso",
                                        "estado_rotulo": "Em curso",
                                        "estado_tom": "marca",
                                        "inicio": "2026-11-04T18:00:00+00:00",
                                        "fim": "2026-11-04T18:30:00+00:00",
                                        "paciente_id": 1204,
                                        "paciente_nome": "Rui Almeida",
                                        "medico_id": 7,
                                        "medico_nome": "Inês Valente",
                                        "consentimento": true,
                                        "consentimento_gravacao": false,
                                        "gravacao_permitida": false,
                                        "sala_espera_em": "2026-11-04T17:56:10+00:00",
                                        "admitido_em": "2026-11-04T18:01:02+00:00",
                                        "identidade_metodo": "documento",
                                        "identidade_confirmada_em": "2026-11-04T18:02:30+00:00",
                                        "identidade_confirmada_por": "Inês Valente",
                                        "presentes": [
                                            {
                                                "nome": "Rui Almeida",
                                                "papel": "paciente",
                                                "relacao": "",
                                                "registado_em": "2026-11-04T18:03:00+00:00"
                                            },
                                            {
                                                "nome": "Sofia Almeida",
                                                "papel": "acompanhante",
                                                "relacao": "Cônjuge",
                                                "registado_em": "2026-11-04T18:03:00+00:00"
                                            }
                                        ],
                                        "video_configurado": true,
                                        "sala_url": "https://video.clinica.pt/tc-1-55?papel=anfitriao&t=9f2c7a1e",
                                        "inicio_real": "2026-11-04T18:01:02+00:00",
                                        "fim_real": null,
                                        "relatorio_visivel": true,
                                        "relatorio": null,
                                        "relatorio_origem": null,
                                        "relatorio_fechado_em": null,
                                        "comprovativo_ficheiro_id": null,
                                        "relatorio_ficheiro_id": null,
                                        "capturas": [
                                            {
                                                "ficheiro_id": 7781,
                                                "criado_em": "2026-11-04T18:12:40+00:00"
                                            }
                                        ],
                                        "assistente": true,
                                        "pode_editar": true,
                                        "passos": [
                                            {
                                                "chave": "consentimento",
                                                "feito": true
                                            },
                                            {
                                                "chave": "sala_espera",
                                                "feito": true
                                            },
                                            {
                                                "chave": "admitido",
                                                "feito": true
                                            },
                                            {
                                                "chave": "identidade",
                                                "feito": true
                                            },
                                            {
                                                "chave": "presentes",
                                                "feito": true
                                            },
                                            {
                                                "chave": "relatorio",
                                                "feito": false
                                            },
                                            {
                                                "chave": "fechada",
                                                "feito": false
                                            }
                                        ],
                                        "consentimento_texto": {
                                            "titulo": "Consentimento para teleconsulta",
                                            "texto": "<p>Autorizo a realização da consulta por videoconsulta e fui informado(a) das suas limitações.</p>"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/teleconsultas/{id}/admitir": {
            "post": {
                "tags": [
                    "Teleconsulta"
                ],
                "operationId": "m6AdmitirTeleconsulta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da teleconsulta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-nivel": "editar",
                "summary": "Admitir o paciente e iniciar a sessão",
                "description": "Exige consentimento de teleconsulta válido (422 «consentimento_em_falta»). Cria a sala no serviço de vídeo das Definições (uma vez; o endereço do anfitrião fica cifrado; 503 «video_indisponivel» se o serviço falhar) e inicia a sessão: só a partir daqui o paciente recebe o endereço da sala. Teleconsulta terminada ou fechada → 409. Efeitos: marcação em curso com check-in, histórico da marcação e auditoria.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Teleconsulta"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 55,
                                        "marcacao_id": 8850,
                                        "estado": "em_curso",
                                        "estado_rotulo": "Em curso",
                                        "estado_tom": "marca",
                                        "inicio": "2026-11-04T18:00:00+00:00",
                                        "fim": "2026-11-04T18:30:00+00:00",
                                        "paciente_id": 1204,
                                        "paciente_nome": "Rui Almeida",
                                        "medico_id": 7,
                                        "medico_nome": "Inês Valente",
                                        "consentimento": true,
                                        "consentimento_gravacao": false,
                                        "gravacao_permitida": false,
                                        "sala_espera_em": "2026-11-04T17:56:10+00:00",
                                        "admitido_em": "2026-11-04T18:01:02+00:00",
                                        "identidade_metodo": "documento",
                                        "identidade_confirmada_em": "2026-11-04T18:02:30+00:00",
                                        "identidade_confirmada_por": "Inês Valente",
                                        "presentes": [
                                            {
                                                "nome": "Rui Almeida",
                                                "papel": "paciente",
                                                "relacao": "",
                                                "registado_em": "2026-11-04T18:03:00+00:00"
                                            },
                                            {
                                                "nome": "Sofia Almeida",
                                                "papel": "acompanhante",
                                                "relacao": "Cônjuge",
                                                "registado_em": "2026-11-04T18:03:00+00:00"
                                            }
                                        ],
                                        "video_configurado": true,
                                        "sala_url": "https://video.clinica.pt/tc-1-55?papel=anfitriao&t=9f2c7a1e",
                                        "inicio_real": "2026-11-04T18:01:02+00:00",
                                        "fim_real": null,
                                        "relatorio_visivel": true,
                                        "relatorio": null,
                                        "relatorio_origem": null,
                                        "relatorio_fechado_em": null,
                                        "comprovativo_ficheiro_id": null,
                                        "relatorio_ficheiro_id": null,
                                        "capturas": [
                                            {
                                                "ficheiro_id": 7781,
                                                "criado_em": "2026-11-04T18:12:40+00:00"
                                            }
                                        ],
                                        "assistente": true,
                                        "pode_editar": true,
                                        "passos": [
                                            {
                                                "chave": "consentimento",
                                                "feito": true
                                            },
                                            {
                                                "chave": "sala_espera",
                                                "feito": true
                                            },
                                            {
                                                "chave": "admitido",
                                                "feito": true
                                            },
                                            {
                                                "chave": "identidade",
                                                "feito": true
                                            },
                                            {
                                                "chave": "presentes",
                                                "feito": true
                                            },
                                            {
                                                "chave": "relatorio",
                                                "feito": false
                                            },
                                            {
                                                "chave": "fechada",
                                                "feito": false
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Não é possível neste estado."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Regra de negócio (consentimento_em_falta)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "consentimento_em_falta": {
                                        "summary": "consentimento_em_falta",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "consentimento_em_falta",
                                                "mensagem": "O paciente ainda não deu o consentimento para a teleconsulta.",
                                                "campos": {
                                                    "consentimento": "O paciente ainda não deu o consentimento para a teleconsulta."
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Regra de negócio (video_indisponivel)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "video_indisponivel": {
                                        "summary": "video_indisponivel",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "video_indisponivel",
                                                "mensagem": "Não foi possível criar a sala de vídeo. Tente de novo."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/teleconsultas/{id}/captura": {
            "post": {
                "tags": [
                    "Teleconsulta"
                ],
                "operationId": "m6CapturaTeleconsulta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da teleconsulta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-nivel": "editar",
                "summary": "Guardar uma captura da videoconsulta",
                "description": "Imagem validada pelo conteúdo, nome aleatório, sem metadados de localização, guardada como ficheiro clínico cifrado do paciente; entra na galeria clínica como «por verificar» quando o módulo de planeamento existe. Exige «teleconsulta» editar e acesso à ficha clínica do paciente. Devolve uma ligação assinada de 15 minutos.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ficheiro"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary",
                                        "description": "Imagem (JPEG, PNG ou WebP)."
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6FicheiroLigacao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ficheiro_id": 7781,
                                        "url": "https://clinica.pt/api/v1/ficheiros/7781/conteudo?assinatura=4f9a2c&expira=1793817600"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/teleconsultas/{id}/consentimento": {
            "post": {
                "tags": [
                    "Teleconsulta"
                ],
                "operationId": "m6ConsentimentoTeleconsulta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da teleconsulta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-nivel": "editar",
                "summary": "Registar o consentimento dado à equipa",
                "description": "Regista no registo de consentimentos do núcleo (decisão «dado», versão aprovada do modelo da clínica) o consentimento de teleconsulta ou de gravação dado de viva voz, presencialmente, por email ou no portal. O paciente também o pode dar ao entrar na sala de espera. Sem paciente → 422.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "finalidade": {
                                        "type": "string",
                                        "enum": [
                                            "teleconsulta",
                                            "gravacao_video"
                                        ],
                                        "default": "teleconsulta"
                                    },
                                    "canal": {
                                        "type": "string",
                                        "enum": [
                                            "telefone",
                                            "presencial",
                                            "email",
                                            "portal"
                                        ],
                                        "default": "telefone"
                                    }
                                },
                                "required": [
                                    "finalidade"
                                ]
                            },
                            "example": {
                                "finalidade": "teleconsulta",
                                "canal": "telefone"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Teleconsulta"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 55,
                                        "marcacao_id": 8850,
                                        "estado": "em_curso",
                                        "estado_rotulo": "Em curso",
                                        "estado_tom": "marca",
                                        "inicio": "2026-11-04T18:00:00+00:00",
                                        "fim": "2026-11-04T18:30:00+00:00",
                                        "paciente_id": 1204,
                                        "paciente_nome": "Rui Almeida",
                                        "medico_id": 7,
                                        "medico_nome": "Inês Valente",
                                        "consentimento": true,
                                        "consentimento_gravacao": false,
                                        "gravacao_permitida": false,
                                        "sala_espera_em": "2026-11-04T17:56:10+00:00",
                                        "admitido_em": "2026-11-04T18:01:02+00:00",
                                        "identidade_metodo": "documento",
                                        "identidade_confirmada_em": "2026-11-04T18:02:30+00:00",
                                        "identidade_confirmada_por": "Inês Valente",
                                        "presentes": [
                                            {
                                                "nome": "Rui Almeida",
                                                "papel": "paciente",
                                                "relacao": "",
                                                "registado_em": "2026-11-04T18:03:00+00:00"
                                            },
                                            {
                                                "nome": "Sofia Almeida",
                                                "papel": "acompanhante",
                                                "relacao": "Cônjuge",
                                                "registado_em": "2026-11-04T18:03:00+00:00"
                                            }
                                        ],
                                        "video_configurado": true,
                                        "sala_url": "https://video.clinica.pt/tc-1-55?papel=anfitriao&t=9f2c7a1e",
                                        "inicio_real": "2026-11-04T18:01:02+00:00",
                                        "fim_real": null,
                                        "relatorio_visivel": true,
                                        "relatorio": null,
                                        "relatorio_origem": null,
                                        "relatorio_fechado_em": null,
                                        "comprovativo_ficheiro_id": null,
                                        "relatorio_ficheiro_id": null,
                                        "capturas": [
                                            {
                                                "ficheiro_id": 7781,
                                                "criado_em": "2026-11-04T18:12:40+00:00"
                                            }
                                        ],
                                        "assistente": true,
                                        "pode_editar": true,
                                        "passos": [
                                            {
                                                "chave": "consentimento",
                                                "feito": true
                                            },
                                            {
                                                "chave": "sala_espera",
                                                "feito": true
                                            },
                                            {
                                                "chave": "admitido",
                                                "feito": true
                                            },
                                            {
                                                "chave": "identidade",
                                                "feito": true
                                            },
                                            {
                                                "chave": "presentes",
                                                "feito": true
                                            },
                                            {
                                                "chave": "relatorio",
                                                "feito": false
                                            },
                                            {
                                                "chave": "fechada",
                                                "feito": false
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/teleconsultas/{id}/fechar": {
            "post": {
                "tags": [
                    "Teleconsulta"
                ],
                "operationId": "m6FecharTeleconsulta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da teleconsulta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-nivel": "editar",
                "summary": "Fechar a teleconsulta",
                "description": "Só fecha com relatório (422 «relatorio_em_falta»). Gera o documento do relatório (clínico, cifrado, partilhado com o paciente) e o comprovativo de presença (documento do módulo de documentos quando existe; senão ficheiro próprio), marca a marcação como concluída, regista um evento clínico na linha do tempo e notifica o paciente de que o relatório está disponível no portal. Exige «teleconsulta» editar e acesso à ficha clínica. Já fechada → 409. Efeitos: auditoria.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Teleconsulta"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 55,
                                        "marcacao_id": 8850,
                                        "estado": "fechada",
                                        "estado_rotulo": "Fechada",
                                        "estado_tom": "sucesso",
                                        "inicio": "2026-11-04T18:00:00+00:00",
                                        "fim": "2026-11-04T18:30:00+00:00",
                                        "paciente_id": 1204,
                                        "paciente_nome": "Rui Almeida",
                                        "medico_id": 7,
                                        "medico_nome": "Inês Valente",
                                        "consentimento": true,
                                        "consentimento_gravacao": false,
                                        "gravacao_permitida": false,
                                        "sala_espera_em": "2026-11-04T17:56:10+00:00",
                                        "admitido_em": "2026-11-04T18:01:02+00:00",
                                        "identidade_metodo": "documento",
                                        "identidade_confirmada_em": "2026-11-04T18:02:30+00:00",
                                        "identidade_confirmada_por": "Inês Valente",
                                        "presentes": [
                                            {
                                                "nome": "Rui Almeida",
                                                "papel": "paciente",
                                                "relacao": "",
                                                "registado_em": "2026-11-04T18:03:00+00:00"
                                            },
                                            {
                                                "nome": "Sofia Almeida",
                                                "papel": "acompanhante",
                                                "relacao": "Cônjuge",
                                                "registado_em": "2026-11-04T18:03:00+00:00"
                                            }
                                        ],
                                        "video_configurado": true,
                                        "sala_url": null,
                                        "inicio_real": "2026-11-04T18:01:02+00:00",
                                        "fim_real": "2026-11-04T18:27:15+00:00",
                                        "relatorio_visivel": true,
                                        "relatorio": "Motivo: avaliação de queda de cabelo frontal com 3 anos de evolução.\nObservação por vídeo: recessão bitemporal, padrão compatível com Norwood III.\nAvaliação: candidato a avaliação presencial com tricoscopia.\nPlano e recomendações: marcar consulta presencial; manter tratamento tópico.\nPróximo contacto: consulta presencial em 2 semanas.\nA consulta decorreu por videoconsulta.",
                                        "relatorio_origem": "assistente",
                                        "relatorio_fechado_em": "2026-11-04T18:41:03+00:00",
                                        "comprovativo_ficheiro_id": 7790,
                                        "relatorio_ficheiro_id": 7789,
                                        "capturas": [
                                            {
                                                "ficheiro_id": 7781,
                                                "criado_em": "2026-11-04T18:12:40+00:00"
                                            }
                                        ],
                                        "assistente": true,
                                        "pode_editar": false,
                                        "passos": [
                                            {
                                                "chave": "consentimento",
                                                "feito": true
                                            },
                                            {
                                                "chave": "sala_espera",
                                                "feito": true
                                            },
                                            {
                                                "chave": "admitido",
                                                "feito": true
                                            },
                                            {
                                                "chave": "identidade",
                                                "feito": true
                                            },
                                            {
                                                "chave": "presentes",
                                                "feito": true
                                            },
                                            {
                                                "chave": "relatorio",
                                                "feito": true
                                            },
                                            {
                                                "chave": "fechada",
                                                "feito": true
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "A teleconsulta já está fechada."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Regra de negócio (relatorio_em_falta)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "relatorio_em_falta": {
                                        "summary": "relatorio_em_falta",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "relatorio_em_falta",
                                                "mensagem": "Escreva o relatório antes de fechar.",
                                                "campos": {
                                                    "relatorio": "Escreva o relatório antes de fechar."
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/teleconsultas/{id}/ficheiros": {
            "post": {
                "tags": [
                    "Teleconsulta"
                ],
                "operationId": "m6TeleconsultaPartilhar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da teleconsulta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-nivel": "editar",
                "summary": "Partilhar um ficheiro com o paciente na sala",
                "description": "Imagem, PDF ou documento (até 25 MB), validado pelo conteúdo, guardado cifrado como ficheiro clínico do paciente e mostrado na sala do paciente para descarregar. Exige a ficha clínica do paciente. Devolve os ficheiros da sessão (com ligações assinadas de 15 minutos).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ficheiro"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "id": 9,
                                            "ficheiro_id": 8811,
                                            "foto_id": null,
                                            "origem": "equipa",
                                            "origem_rotulo": "Partilhado pela equipa",
                                            "nome": "instrucoes-pre-operatorias.pdf",
                                            "tipo": "pdf",
                                            "tamanho": 182233,
                                            "criado_em": "2026-11-04T18:12:00+00:00",
                                            "retirado": false,
                                            "url": "https://clinica.pt/f/…"
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/teleconsultas/{id}/ficheiros/{linha}/retirar": {
            "post": {
                "tags": [
                    "Teleconsulta"
                ],
                "operationId": "m6TeleconsultaRetirar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da teleconsulta"
                    },
                    {
                        "name": "linha",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-nivel": "editar",
                "summary": "Deixar de mostrar um ficheiro ao paciente",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object"
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/teleconsultas/{id}/gravacao": {
            "post": {
                "tags": [
                    "Teleconsulta"
                ],
                "operationId": "m6GravacaoTeleconsulta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da teleconsulta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-nivel": "editar",
                "summary": "Permitir ou impedir a gravação",
                "description": "A gravação está desligada por omissão e só pode ser permitida com o consentimento próprio de gravação (finalidade «gravacao_video») válido — senão 422 «consentimento_em_falta». Efeitos: auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "permitir": {
                                        "type": "boolean"
                                    }
                                },
                                "required": [
                                    "permitir"
                                ]
                            },
                            "example": {
                                "permitir": true
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Teleconsulta"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 55,
                                        "marcacao_id": 8850,
                                        "estado": "em_curso",
                                        "estado_rotulo": "Em curso",
                                        "estado_tom": "marca",
                                        "inicio": "2026-11-04T18:00:00+00:00",
                                        "fim": "2026-11-04T18:30:00+00:00",
                                        "paciente_id": 1204,
                                        "paciente_nome": "Rui Almeida",
                                        "medico_id": 7,
                                        "medico_nome": "Inês Valente",
                                        "consentimento": true,
                                        "consentimento_gravacao": true,
                                        "gravacao_permitida": true,
                                        "sala_espera_em": "2026-11-04T17:56:10+00:00",
                                        "admitido_em": "2026-11-04T18:01:02+00:00",
                                        "identidade_metodo": "documento",
                                        "identidade_confirmada_em": "2026-11-04T18:02:30+00:00",
                                        "identidade_confirmada_por": "Inês Valente",
                                        "presentes": [
                                            {
                                                "nome": "Rui Almeida",
                                                "papel": "paciente",
                                                "relacao": "",
                                                "registado_em": "2026-11-04T18:03:00+00:00"
                                            },
                                            {
                                                "nome": "Sofia Almeida",
                                                "papel": "acompanhante",
                                                "relacao": "Cônjuge",
                                                "registado_em": "2026-11-04T18:03:00+00:00"
                                            }
                                        ],
                                        "video_configurado": true,
                                        "sala_url": "https://video.clinica.pt/tc-1-55?papel=anfitriao&t=9f2c7a1e",
                                        "inicio_real": "2026-11-04T18:01:02+00:00",
                                        "fim_real": null,
                                        "relatorio_visivel": true,
                                        "relatorio": null,
                                        "relatorio_origem": null,
                                        "relatorio_fechado_em": null,
                                        "comprovativo_ficheiro_id": null,
                                        "relatorio_ficheiro_id": null,
                                        "capturas": [
                                            {
                                                "ficheiro_id": 7781,
                                                "criado_em": "2026-11-04T18:12:40+00:00"
                                            }
                                        ],
                                        "assistente": true,
                                        "pode_editar": true,
                                        "passos": [
                                            {
                                                "chave": "consentimento",
                                                "feito": true
                                            },
                                            {
                                                "chave": "sala_espera",
                                                "feito": true
                                            },
                                            {
                                                "chave": "admitido",
                                                "feito": true
                                            },
                                            {
                                                "chave": "identidade",
                                                "feito": true
                                            },
                                            {
                                                "chave": "presentes",
                                                "feito": true
                                            },
                                            {
                                                "chave": "relatorio",
                                                "feito": false
                                            },
                                            {
                                                "chave": "fechada",
                                                "feito": false
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Regra de negócio (consentimento_em_falta)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "consentimento_em_falta": {
                                        "summary": "consentimento_em_falta",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "consentimento_em_falta",
                                                "mensagem": "Sem consentimento para gravar.",
                                                "campos": {
                                                    "gravacao": "Sem consentimento para gravar."
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/teleconsultas/{id}/identidade": {
            "post": {
                "tags": [
                    "Teleconsulta"
                ],
                "operationId": "m6IdentidadeTeleconsulta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da teleconsulta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-nivel": "editar",
                "summary": "Confirmar a identidade do paciente",
                "description": "Regista o método, quem confirmou e quando (início da sessão). Efeitos: auditoria.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "metodo": {
                                        "type": "string",
                                        "enum": [
                                            "documento",
                                            "conhecido",
                                            "dados_pessoais"
                                        ]
                                    }
                                },
                                "required": [
                                    "metodo"
                                ]
                            },
                            "example": {
                                "metodo": "documento"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Teleconsulta"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 55,
                                        "marcacao_id": 8850,
                                        "estado": "em_curso",
                                        "estado_rotulo": "Em curso",
                                        "estado_tom": "marca",
                                        "inicio": "2026-11-04T18:00:00+00:00",
                                        "fim": "2026-11-04T18:30:00+00:00",
                                        "paciente_id": 1204,
                                        "paciente_nome": "Rui Almeida",
                                        "medico_id": 7,
                                        "medico_nome": "Inês Valente",
                                        "consentimento": true,
                                        "consentimento_gravacao": false,
                                        "gravacao_permitida": false,
                                        "sala_espera_em": "2026-11-04T17:56:10+00:00",
                                        "admitido_em": "2026-11-04T18:01:02+00:00",
                                        "identidade_metodo": "documento",
                                        "identidade_confirmada_em": "2026-11-04T18:02:30+00:00",
                                        "identidade_confirmada_por": "Inês Valente",
                                        "presentes": [
                                            {
                                                "nome": "Rui Almeida",
                                                "papel": "paciente",
                                                "relacao": "",
                                                "registado_em": "2026-11-04T18:03:00+00:00"
                                            },
                                            {
                                                "nome": "Sofia Almeida",
                                                "papel": "acompanhante",
                                                "relacao": "Cônjuge",
                                                "registado_em": "2026-11-04T18:03:00+00:00"
                                            }
                                        ],
                                        "video_configurado": true,
                                        "sala_url": "https://video.clinica.pt/tc-1-55?papel=anfitriao&t=9f2c7a1e",
                                        "inicio_real": "2026-11-04T18:01:02+00:00",
                                        "fim_real": null,
                                        "relatorio_visivel": true,
                                        "relatorio": null,
                                        "relatorio_origem": null,
                                        "relatorio_fechado_em": null,
                                        "comprovativo_ficheiro_id": null,
                                        "relatorio_ficheiro_id": null,
                                        "capturas": [
                                            {
                                                "ficheiro_id": 7781,
                                                "criado_em": "2026-11-04T18:12:40+00:00"
                                            }
                                        ],
                                        "assistente": true,
                                        "pode_editar": true,
                                        "passos": [
                                            {
                                                "chave": "consentimento",
                                                "feito": true
                                            },
                                            {
                                                "chave": "sala_espera",
                                                "feito": true
                                            },
                                            {
                                                "chave": "admitido",
                                                "feito": true
                                            },
                                            {
                                                "chave": "identidade",
                                                "feito": true
                                            },
                                            {
                                                "chave": "presentes",
                                                "feito": true
                                            },
                                            {
                                                "chave": "relatorio",
                                                "feito": false
                                            },
                                            {
                                                "chave": "fechada",
                                                "feito": false
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/teleconsultas/{id}/presentes": {
            "post": {
                "tags": [
                    "Teleconsulta"
                ],
                "operationId": "m6PresentesTeleconsulta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da teleconsulta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-nivel": "editar",
                "summary": "Registar quem está presente",
                "description": "Substitui a lista (até 12 pessoas; linhas sem nome são ignoradas; papel desconhecido passa a «outro»). Efeitos: auditoria (só o número de pessoas).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "presentes": {
                                        "type": "array",
                                        "maxItems": 12,
                                        "items": {
                                            "type": "object",
                                            "required": [
                                                "nome"
                                            ],
                                            "properties": {
                                                "nome": {
                                                    "type": "string",
                                                    "maxLength": 120
                                                },
                                                "papel": {
                                                    "type": "string",
                                                    "enum": [
                                                        "paciente",
                                                        "acompanhante",
                                                        "medico",
                                                        "interprete",
                                                        "outro"
                                                    ],
                                                    "default": "acompanhante"
                                                },
                                                "relacao": {
                                                    "type": "string",
                                                    "maxLength": 60
                                                }
                                            }
                                        }
                                    }
                                },
                                "required": [
                                    "presentes"
                                ]
                            },
                            "example": {
                                "presentes": [
                                    {
                                        "nome": "Rui Almeida",
                                        "papel": "paciente"
                                    },
                                    {
                                        "nome": "Sofia Almeida",
                                        "papel": "acompanhante",
                                        "relacao": "Cônjuge"
                                    }
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Teleconsulta"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 55,
                                        "marcacao_id": 8850,
                                        "estado": "em_curso",
                                        "estado_rotulo": "Em curso",
                                        "estado_tom": "marca",
                                        "inicio": "2026-11-04T18:00:00+00:00",
                                        "fim": "2026-11-04T18:30:00+00:00",
                                        "paciente_id": 1204,
                                        "paciente_nome": "Rui Almeida",
                                        "medico_id": 7,
                                        "medico_nome": "Inês Valente",
                                        "consentimento": true,
                                        "consentimento_gravacao": false,
                                        "gravacao_permitida": false,
                                        "sala_espera_em": "2026-11-04T17:56:10+00:00",
                                        "admitido_em": "2026-11-04T18:01:02+00:00",
                                        "identidade_metodo": "documento",
                                        "identidade_confirmada_em": "2026-11-04T18:02:30+00:00",
                                        "identidade_confirmada_por": "Inês Valente",
                                        "presentes": [
                                            {
                                                "nome": "Rui Almeida",
                                                "papel": "paciente",
                                                "relacao": "",
                                                "registado_em": "2026-11-04T18:03:00+00:00"
                                            },
                                            {
                                                "nome": "Sofia Almeida",
                                                "papel": "acompanhante",
                                                "relacao": "Cônjuge",
                                                "registado_em": "2026-11-04T18:03:00+00:00"
                                            }
                                        ],
                                        "video_configurado": true,
                                        "sala_url": "https://video.clinica.pt/tc-1-55?papel=anfitriao&t=9f2c7a1e",
                                        "inicio_real": "2026-11-04T18:01:02+00:00",
                                        "fim_real": null,
                                        "relatorio_visivel": true,
                                        "relatorio": null,
                                        "relatorio_origem": null,
                                        "relatorio_fechado_em": null,
                                        "comprovativo_ficheiro_id": null,
                                        "relatorio_ficheiro_id": null,
                                        "capturas": [
                                            {
                                                "ficheiro_id": 7781,
                                                "criado_em": "2026-11-04T18:12:40+00:00"
                                            }
                                        ],
                                        "assistente": true,
                                        "pode_editar": true,
                                        "passos": [
                                            {
                                                "chave": "consentimento",
                                                "feito": true
                                            },
                                            {
                                                "chave": "sala_espera",
                                                "feito": true
                                            },
                                            {
                                                "chave": "admitido",
                                                "feito": true
                                            },
                                            {
                                                "chave": "identidade",
                                                "feito": true
                                            },
                                            {
                                                "chave": "presentes",
                                                "feito": true
                                            },
                                            {
                                                "chave": "relatorio",
                                                "feito": false
                                            },
                                            {
                                                "chave": "fechada",
                                                "feito": false
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/teleconsultas/{id}/proposta": {
            "post": {
                "tags": [
                    "Teleconsulta"
                ],
                "operationId": "m6PropostaRelatorioTeleconsulta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da teleconsulta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-nivel": "editar",
                "summary": "Proposta de relatório pelo Assistente",
                "description": "O Assistente (uso «escriba», modelos escolhidos em Definições › Modelos de IA) redige a partir das notas do médico um relatório estruturado (motivo, antecedentes referidos, observação por vídeo, avaliação, plano, próximo contacto), sem inventar dados. Os dados do paciente só vão ao serviço local, salvo a opção própria desse uso. Nada é gravado: o médico revê, corrige e grava com PUT /teleconsultas/{id}/relatorio. Sem o Assistente configurado devolve 200 com ok:false e «erro». Exige «teleconsulta» editar e acesso à ficha clínica. Limite: 20 pedidos por 10 minutos.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "notas": {
                                        "type": "string",
                                        "minLength": 1,
                                        "maxLength": 8000
                                    }
                                },
                                "required": [
                                    "notas"
                                ]
                            },
                            "example": {
                                "notas": "Queda frontal 3 anos. Recessão bitemporal. Norwood III. Sem doenças. Faz minoxidil. Marcar presencial com tricoscopia em 2 semanas."
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6PropostaRelatorio"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ok": true,
                                        "texto": "Motivo: avaliação de queda de cabelo frontal com 3 anos de evolução.\nObservação por vídeo: recessão bitemporal, padrão compatível com Norwood III.\nAvaliação: candidato a avaliação presencial com tricoscopia.\nPlano e recomendações: marcar consulta presencial; manter tratamento tópico.\nPróximo contacto: consulta presencial em 2 semanas.\nA consulta decorreu por videoconsulta.",
                                        "pedido_id": 5521,
                                        "erro": null
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/teleconsultas/{id}/relatorio": {
            "put": {
                "tags": [
                    "Teleconsulta"
                ],
                "operationId": "m6RelatorioTeleconsulta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-nivel": "editar",
                "summary": "Gravar o relatório",
                "description": "Grava o relatório (até 20 000 caracteres), cifrado com a chave clínica; quem grava fica como validador. Quando o texto parte de uma proposta do Assistente, envie ia_pedido_id, ia_fornecedor e ia_modelo exatamente como vieram em POST /teleconsultas/{id}/proposta (origem «assistente»). Exige «teleconsulta» editar e acesso à ficha clínica. Teleconsulta fechada → 409. Efeitos: auditoria (só os nomes dos campos).",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da teleconsulta"
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "relatorio": {
                                        "type": "string",
                                        "maxLength": 20000
                                    },
                                    "ia_pedido_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ],
                                        "description": "Pedido do Assistente que originou o texto."
                                    },
                                    "ia_fornecedor": {
                                        "type": "string",
                                        "maxLength": 20,
                                        "description": "Serviço de IA que respondeu (valor devolvido pela proposta)."
                                    },
                                    "ia_modelo": {
                                        "type": "string",
                                        "maxLength": 120,
                                        "description": "Modelo usado (valor devolvido pela proposta)."
                                    }
                                },
                                "required": [
                                    "relatorio"
                                ]
                            },
                            "example": {
                                "relatorio": "Motivo: avaliação de queda de cabelo frontal com 3 anos de evolução.\nObservação por vídeo: recessão bitemporal, padrão compatível com Norwood III.\nAvaliação: candidato a avaliação presencial com tricoscopia.\nPlano e recomendações: marcar consulta presencial; manter tratamento tópico.\nPróximo contacto: consulta presencial em 2 semanas.\nA consulta decorreu por videoconsulta.",
                                "ia_pedido_id": 5521
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Teleconsulta"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 55,
                                        "marcacao_id": 8850,
                                        "estado": "em_curso",
                                        "estado_rotulo": "Em curso",
                                        "estado_tom": "marca",
                                        "inicio": "2026-11-04T18:00:00+00:00",
                                        "fim": "2026-11-04T18:30:00+00:00",
                                        "paciente_id": 1204,
                                        "paciente_nome": "Rui Almeida",
                                        "medico_id": 7,
                                        "medico_nome": "Inês Valente",
                                        "consentimento": true,
                                        "consentimento_gravacao": false,
                                        "gravacao_permitida": false,
                                        "sala_espera_em": "2026-11-04T17:56:10+00:00",
                                        "admitido_em": "2026-11-04T18:01:02+00:00",
                                        "identidade_metodo": "documento",
                                        "identidade_confirmada_em": "2026-11-04T18:02:30+00:00",
                                        "identidade_confirmada_por": "Inês Valente",
                                        "presentes": [
                                            {
                                                "nome": "Rui Almeida",
                                                "papel": "paciente",
                                                "relacao": "",
                                                "registado_em": "2026-11-04T18:03:00+00:00"
                                            },
                                            {
                                                "nome": "Sofia Almeida",
                                                "papel": "acompanhante",
                                                "relacao": "Cônjuge",
                                                "registado_em": "2026-11-04T18:03:00+00:00"
                                            }
                                        ],
                                        "video_configurado": true,
                                        "sala_url": "https://video.clinica.pt/tc-1-55?papel=anfitriao&t=9f2c7a1e",
                                        "inicio_real": "2026-11-04T18:01:02+00:00",
                                        "fim_real": null,
                                        "relatorio_visivel": true,
                                        "relatorio": "Motivo: avaliação de queda de cabelo frontal com 3 anos de evolução.\nObservação por vídeo: recessão bitemporal, padrão compatível com Norwood III.\nAvaliação: candidato a avaliação presencial com tricoscopia.\nPlano e recomendações: marcar consulta presencial; manter tratamento tópico.\nPróximo contacto: consulta presencial em 2 semanas.\nA consulta decorreu por videoconsulta.",
                                        "relatorio_origem": "assistente",
                                        "relatorio_fechado_em": null,
                                        "comprovativo_ficheiro_id": null,
                                        "relatorio_ficheiro_id": null,
                                        "capturas": [
                                            {
                                                "ficheiro_id": 7781,
                                                "criado_em": "2026-11-04T18:12:40+00:00"
                                            }
                                        ],
                                        "assistente": true,
                                        "pode_editar": true,
                                        "passos": [
                                            {
                                                "chave": "consentimento",
                                                "feito": true
                                            },
                                            {
                                                "chave": "sala_espera",
                                                "feito": true
                                            },
                                            {
                                                "chave": "admitido",
                                                "feito": true
                                            },
                                            {
                                                "chave": "identidade",
                                                "feito": true
                                            },
                                            {
                                                "chave": "presentes",
                                                "feito": true
                                            },
                                            {
                                                "chave": "relatorio",
                                                "feito": false
                                            },
                                            {
                                                "chave": "fechada",
                                                "feito": false
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Não é possível neste estado."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/teleconsultas/{id}/resumo": {
            "post": {
                "tags": [
                    "Teleconsulta"
                ],
                "operationId": "m6TeleconsultaResumo",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da teleconsulta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-nivel": "editar",
                "summary": "Propor o relatório a partir da transcrição",
                "description": "Exige o consentimento «ia». Transcrições longas resumem-se por partes e depois no todo. Nada é gravado: o médico revê e grava com PUT …/relatorio (ia_pedido_id, ia_fornecedor, ia_modelo). Limite: 20 por 10 minutos.",
                "requestBody": {
                    "required": false,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "notas": {
                                        "type": "string",
                                        "maxLength": 8000
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ok": {
                                                    "type": "boolean"
                                                },
                                                "texto": {
                                                    "type": "string"
                                                },
                                                "fornecedor": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "modelo": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "pedido_id": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                },
                                                "erro": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/teleconsultas/{id}/terminar": {
            "post": {
                "tags": [
                    "Teleconsulta"
                ],
                "operationId": "m6TerminarTeleconsulta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da teleconsulta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-nivel": "editar",
                "summary": "Terminar a chamada",
                "description": "Passa a «terminada» e regista a hora de fim; o relatório pode ser escrito a seguir. Só a partir de agendada, sala de espera ou em curso (409 «estado_invalido»). Efeitos: auditoria.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M6Teleconsulta"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 55,
                                        "marcacao_id": 8850,
                                        "estado": "terminada",
                                        "estado_rotulo": "Terminada",
                                        "estado_tom": "info",
                                        "inicio": "2026-11-04T18:00:00+00:00",
                                        "fim": "2026-11-04T18:30:00+00:00",
                                        "paciente_id": 1204,
                                        "paciente_nome": "Rui Almeida",
                                        "medico_id": 7,
                                        "medico_nome": "Inês Valente",
                                        "consentimento": true,
                                        "consentimento_gravacao": false,
                                        "gravacao_permitida": false,
                                        "sala_espera_em": "2026-11-04T17:56:10+00:00",
                                        "admitido_em": "2026-11-04T18:01:02+00:00",
                                        "identidade_metodo": "documento",
                                        "identidade_confirmada_em": "2026-11-04T18:02:30+00:00",
                                        "identidade_confirmada_por": "Inês Valente",
                                        "presentes": [
                                            {
                                                "nome": "Rui Almeida",
                                                "papel": "paciente",
                                                "relacao": "",
                                                "registado_em": "2026-11-04T18:03:00+00:00"
                                            },
                                            {
                                                "nome": "Sofia Almeida",
                                                "papel": "acompanhante",
                                                "relacao": "Cônjuge",
                                                "registado_em": "2026-11-04T18:03:00+00:00"
                                            }
                                        ],
                                        "video_configurado": true,
                                        "sala_url": "https://video.clinica.pt/tc-1-55?papel=anfitriao&t=9f2c7a1e",
                                        "inicio_real": "2026-11-04T18:01:02+00:00",
                                        "fim_real": "2026-11-04T18:27:15+00:00",
                                        "relatorio_visivel": true,
                                        "relatorio": null,
                                        "relatorio_origem": null,
                                        "relatorio_fechado_em": null,
                                        "comprovativo_ficheiro_id": null,
                                        "relatorio_ficheiro_id": null,
                                        "capturas": [
                                            {
                                                "ficheiro_id": 7781,
                                                "criado_em": "2026-11-04T18:12:40+00:00"
                                            }
                                        ],
                                        "assistente": true,
                                        "pode_editar": true,
                                        "passos": [
                                            {
                                                "chave": "consentimento",
                                                "feito": true
                                            },
                                            {
                                                "chave": "sala_espera",
                                                "feito": true
                                            },
                                            {
                                                "chave": "admitido",
                                                "feito": true
                                            },
                                            {
                                                "chave": "identidade",
                                                "feito": true
                                            },
                                            {
                                                "chave": "presentes",
                                                "feito": true
                                            },
                                            {
                                                "chave": "relatorio",
                                                "feito": false
                                            },
                                            {
                                                "chave": "fechada",
                                                "feito": false
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Regra de negócio (estado_invalido)",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/M6RespostaErro"
                                },
                                "examples": {
                                    "estado_invalido": {
                                        "summary": "estado_invalido",
                                        "value": {
                                            "ok": false,
                                            "erro": {
                                                "codigo": "estado_invalido",
                                                "mensagem": "Não é possível neste estado."
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/teleconsultas/{id}/transcricao": {
            "get": {
                "tags": [
                    "Teleconsulta"
                ],
                "operationId": "m6TeleconsultaTranscricao",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da teleconsulta"
                    }
                ],
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-nivel": "editar",
                "summary": "Texto da transcrição da sessão",
                "description": "Leitura auditada; exige a ficha clínica do paciente.",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "texto": {
                                                    "type": "string"
                                                },
                                                "partes": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            },
            "post": {
                "tags": [
                    "Teleconsulta"
                ],
                "operationId": "m6TeleconsultaTranscrever",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da teleconsulta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-nivel": "editar",
                "summary": "Transcrever uma parte do áudio da sessão",
                "description": "Só com os consentimentos «gravacao_video» e «ia» do paciente válidos e a gravação permitida (422 «consentimento_em_falta»). Parte até 25 MB e 15 minutos (WAV de preferência; outros formatos só o recurso externo transcreve). Transcrição pelo uso de IA «teleconsulta_resumo» (serviço local primeiro); o texto junta-se à transcrição cifrada; o áudio nunca é guardado. Partes repetidas («parte» já recebida) são ignoradas. Limite: 240 por hora.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "ficheiro",
                                    "parte"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary"
                                    },
                                    "parte": {
                                        "type": "integer"
                                    },
                                    "lingua": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "pode_transcrever": true,
                                        "pode_resumir": true,
                                        "tem_transcricao": true,
                                        "partes": 4,
                                        "segundos": 120,
                                        "repetida": false,
                                        "caracteres": 412
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "409": {
                        "$ref": "#/components/responses/Conflito"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/teleconsultas/{id}/transcricao/descartar": {
            "post": {
                "tags": [
                    "Teleconsulta"
                ],
                "operationId": "m6TeleconsultaDescartar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da teleconsulta"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-nivel": "editar",
                "summary": "Descartar a transcrição",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/tricoscopia": {
            "post": {
                "tags": [
                    "Tricoscopia"
                ],
                "operationId": "criarCampoTricoscopia",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "summary": "Gravar um campo",
                "description": "Os valores calculados são sempre recalculados no servidor. ponto: {x, y} no diagrama (0–1) ou {x, y, z} no modelo 3D.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "paciente_id": {
                                        "type": "integer"
                                    },
                                    "subzona": {
                                        "type": "string"
                                    },
                                    "captura_id": {
                                        "type": "integer"
                                    },
                                    "marco_id": {
                                        "type": "integer"
                                    },
                                    "aparelho": {
                                        "type": "string"
                                    },
                                    "ampliacao": {
                                        "type": "number"
                                    },
                                    "area_campo_mm2": {
                                        "type": "number"
                                    },
                                    "uf_1": {
                                        "type": "integer"
                                    },
                                    "uf_2": {
                                        "type": "integer"
                                    },
                                    "uf_3": {
                                        "type": "integer"
                                    },
                                    "uf_4": {
                                        "type": "integer"
                                    },
                                    "calibre_mm": {
                                        "type": "number"
                                    },
                                    "calibre_amostra": {
                                        "type": "integer"
                                    },
                                    "ponto": {
                                        "type": "object"
                                    },
                                    "notas": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "paciente_id",
                                    "subzona",
                                    "area_campo_mm2"
                                ]
                            },
                            "example": {
                                "paciente_id": 1204,
                                "subzona": "occipital",
                                "aparelho": "Dermatoscópio A",
                                "ampliacao": 20,
                                "area_campo_mm2": 100,
                                "uf_1": 18,
                                "uf_2": 38,
                                "uf_3": 17,
                                "uf_4": 2,
                                "ponto": {
                                    "x": 0.5,
                                    "y": 0.91
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "campo": {
                                                    "$ref": "#/components/schemas/CampoTricoscopia"
                                                },
                                                "calculo": {
                                                    "$ref": "#/components/schemas/CalculoCampo"
                                                },
                                                "medias": {
                                                    "type": "object"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/tricoscopia/analisar": {
            "post": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "analisarTricoscopia",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "summary": "Contagem na imagem do tricoscópio (proposta)",
                "description": "UF por tipo (1, 2, 3, 4+), cabelos e diâmetros propostos pela IA de visão (uso tricoscopia_contagem); o servidor converte os diâmetros em calibre e classes e calcula densidades com o mesmo cálculo das contagens à mão. Fica pendente até decisão. Exige o consentimento «ia». Multipart (ficheiro) ou JSON (ficheiro_id).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "paciente_id",
                                    "area_campo_mm2",
                                    "subzona"
                                ],
                                "properties": {
                                    "ficheiro": {
                                        "type": "string",
                                        "format": "binary"
                                    },
                                    "ficheiro_id": {
                                        "type": "integer"
                                    },
                                    "paciente_id": {
                                        "type": "integer"
                                    },
                                    "area_campo_mm2": {
                                        "type": "number",
                                        "x-unidade": "mm²"
                                    },
                                    "subzona": {
                                        "type": "string"
                                    },
                                    "aparelho": {
                                        "type": "string"
                                    },
                                    "ampliacao": {
                                        "type": "number"
                                    },
                                    "captura_id": {
                                        "type": "integer"
                                    },
                                    "tricoscopia_id": {
                                        "type": "integer"
                                    },
                                    "ponto": {
                                        "type": "string",
                                        "description": "JSON {x, y[, z]}"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/AnaliseTricoscopia"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/tricoscopia/analises": {
            "get": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "listarAnalisesTricoscopia",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "ver",
                "summary": "Propostas de contagem do paciente e concordância",
                "parameters": [
                    {
                        "name": "paciente_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Paciente"
                    },
                    {
                        "name": "estado",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "pendente",
                                "aceite",
                                "corrigida",
                                "recusada"
                            ]
                        },
                        "description": "Estado"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/AnaliseTricoscopia"
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "desempenho": {
                                                    "type": "object"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/tricoscopia/analises/{id}/decidir": {
            "post": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "decidirAnaliseTricoscopia",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "summary": "Aceitar, corrigir ou recusar a proposta",
                "description": "«aceite» grava o campo com os valores propostos; «corrigida» com os valores enviados; «recusada» exige motivo. Fica o rastreio (pedido, serviço, modelo, quem decidiu e quando).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "decisao": {
                                        "type": "string",
                                        "enum": [
                                            "aceite",
                                            "corrigida",
                                            "recusada"
                                        ]
                                    },
                                    "valores": {
                                        "type": "object"
                                    },
                                    "motivo": {
                                        "type": "string",
                                        "maxLength": 400
                                    },
                                    "campo": {
                                        "type": "object"
                                    }
                                },
                                "required": [
                                    "decisao"
                                ]
                            },
                            "example": {
                                "decisao": "corrigida",
                                "valores": {
                                    "uf_1": 17,
                                    "uf_2": 39,
                                    "uf_3": 16,
                                    "uf_4": 2
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "analise": {
                                                    "$ref": "#/components/schemas/AnaliseTricoscopia"
                                                },
                                                "campo": {
                                                    "type": [
                                                        "object",
                                                        "null"
                                                    ]
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/tricoscopia/calcular": {
            "post": {
                "tags": [
                    "Tricoscopia"
                ],
                "operationId": "calcularCampoTricoscopia",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "ver",
                "summary": "Calcular um campo (ao vivo, sem gravar)",
                "description": "UF/cm² = UF ÷ (área mm² ÷ 100); cabelos/cm²; cabelos/UF; composição das UF; classes de espessura por contagens; valor de cobertura = calibre × cabelos/cm²; avisos (calibre com menos de 25 cabelos, percentagens que não somam 100).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "area_campo_mm2": {
                                        "type": "number",
                                        "x-unidade": "mm²"
                                    },
                                    "uf_1": {
                                        "type": "integer"
                                    },
                                    "uf_2": {
                                        "type": "integer"
                                    },
                                    "uf_3": {
                                        "type": "integer"
                                    },
                                    "uf_4": {
                                        "type": "integer"
                                    },
                                    "cabelos_total": {
                                        "type": "integer"
                                    },
                                    "calibre_mm": {
                                        "type": "number",
                                        "x-unidade": "mm"
                                    },
                                    "calibre_amostra": {
                                        "type": "integer"
                                    },
                                    "n_vellus": {
                                        "type": "integer"
                                    },
                                    "n_intermedios": {
                                        "type": "integer"
                                    },
                                    "n_terminais": {
                                        "type": "integer"
                                    }
                                },
                                "required": [
                                    "area_campo_mm2"
                                ]
                            },
                            "example": {
                                "area_campo_mm2": 100,
                                "uf_1": 18,
                                "uf_2": 38,
                                "uf_3": 17,
                                "uf_4": 2,
                                "calibre_mm": 0.065,
                                "calibre_amostra": 30
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/CalculoCampo"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "densidade_uf_cm2": {
                                            "valor": 75,
                                            "unidade": "UF/cm²"
                                        },
                                        "densidade_cabelos_cm2": {
                                            "valor": 153,
                                            "unidade": "cabelos/cm²"
                                        },
                                        "cabelos_por_uf": {
                                            "valor": 2.04,
                                            "unidade": "cabelos/UF"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/tricoscopia/medicoes": {
            "post": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "criarMedicaoCapilar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "summary": "Registar um tricograma ou índice de massa capilar",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "tipo": {
                                        "type": "string"
                                    },
                                    "paciente_id": {
                                        "type": "integer"
                                    },
                                    "subzona": {
                                        "type": "string"
                                    },
                                    "ponto": {
                                        "type": "object"
                                    },
                                    "data": {
                                        "type": "string"
                                    },
                                    "aparado_em": {
                                        "type": "string"
                                    },
                                    "anagenio": {
                                        "type": "integer"
                                    },
                                    "telogenio": {
                                        "type": "integer"
                                    },
                                    "indice_massa": {
                                        "type": "number"
                                    },
                                    "aparelho": {
                                        "type": "string"
                                    },
                                    "area_campo_mm2": {
                                        "type": "number"
                                    },
                                    "captura_id": {
                                        "type": "integer"
                                    },
                                    "marco_id": {
                                        "type": "integer"
                                    },
                                    "ficheiro_id": {
                                        "type": "integer"
                                    },
                                    "ficheiro_aparo_id": {
                                        "type": "integer"
                                    },
                                    "notas": {
                                        "type": "string"
                                    }
                                },
                                "required": [
                                    "tipo",
                                    "paciente_id",
                                    "subzona"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Criado",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/MedicaoCapilar"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/tricoscopia/medicoes/calcular": {
            "post": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "calcularMedicaoCapilar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "ver",
                "summary": "Calcular uma medição (sem gravar)",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "tipo": {
                                        "type": "string",
                                        "enum": [
                                            "tricograma",
                                            "massa_capilar"
                                        ]
                                    },
                                    "anagenio": {
                                        "type": "integer"
                                    },
                                    "telogenio": {
                                        "type": "integer"
                                    },
                                    "aparado_em": {
                                        "type": "string"
                                    },
                                    "data": {
                                        "type": "string"
                                    },
                                    "indice_massa": {
                                        "type": "number"
                                    }
                                },
                                "required": [
                                    "tipo"
                                ]
                            },
                            "example": {
                                "tipo": "tricograma",
                                "anagenio": 42,
                                "telogenio": 8,
                                "aparado_em": "2026-10-27 10:00:00",
                                "data": "2026-10-29 10:30:00"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/tricoscopia/medicoes/{id}": {
            "put": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "alterarMedicaoCapilar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "summary": "Alterar uma medição",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "tipo": {
                                        "type": "string"
                                    },
                                    "subzona": {
                                        "type": "string"
                                    },
                                    "data": {
                                        "type": "string"
                                    },
                                    "aparado_em": {
                                        "type": "string"
                                    },
                                    "anagenio": {
                                        "type": "integer"
                                    },
                                    "telogenio": {
                                        "type": "integer"
                                    },
                                    "indice_massa": {
                                        "type": "number"
                                    },
                                    "notas": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/MedicaoCapilar"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            },
            "delete": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "apagarMedicaoCapilar",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "summary": "Apagar uma medição",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/tricoscopia/pacientes/{paciente_id}": {
            "get": {
                "tags": [
                    "Tricoscopia"
                ],
                "operationId": "tricoscopiaPaciente",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "ver",
                "summary": "Campos, médias por subzona e calibrações",
                "parameters": [
                    {
                        "name": "paciente_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "name": "captura_id",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        },
                        "description": "Captura"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/tricoscopia/pacientes/{paciente_id}/seguimento": {
            "get": {
                "tags": [
                    "Análise e plano"
                ],
                "operationId": "seguimentoTricoscopia",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:ver"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "name": "paciente_id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "ver",
                "summary": "Tricograma, massa capilar e séries do mesmo ponto",
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "medicoes": {
                                                    "type": "array",
                                                    "items": {
                                                        "$ref": "#/components/schemas/MedicaoCapilar"
                                                    }
                                                },
                                                "series": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "tolerancia": {
                                                    "type": "number"
                                                },
                                                "subzonas": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "tipos": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                },
                                                "horas_tricograma": {
                                                    "$ref": "#/components/schemas/ValorComUnidade"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    }
                }
            }
        },
        "/tricoscopia/usar-no-plano": {
            "post": {
                "tags": [
                    "Tricoscopia"
                ],
                "operationId": "usarTricoscopiaNoPlano",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.plano:editar"
                        ]
                    }
                ],
                "parameters": [
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-nivel": "editar",
                "summary": "Usar as médias no plano",
                "description": "Preenche as dadoras do plano em rascunho (densidade, cabelos/UF, calibre, desvio, amostras) e recalcula.",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "plano_id": {
                                        "type": "integer"
                                    },
                                    "captura_id": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                },
                                "required": [
                                    "plano_id"
                                ]
                            },
                            "example": {
                                "plano_id": 318
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "plano_id": {
                                                    "type": "integer"
                                                },
                                                "subzonas": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    }
                                                },
                                                "resultado": {
                                                    "$ref": "#/components/schemas/ResultadoMotor"
                                                },
                                                "mensagem": {
                                                    "type": "string"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/tricoscopia/{id}": {
            "put": {
                "tags": [
                    "Tricoscopia"
                ],
                "operationId": "alterarCampoTricoscopia",
                "security": [
                    {
                        "utilizador": []
                    },
                    {
                        "integracao": [
                            "ficha.captura:editar"
                        ]
                    }
                ],
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-nivel": "editar",
                "summary": "Alterar um campo",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "subzona": {
                                        "type": "string"
                                    },
                                    "uf_1": {
                                        "type": "integer"
                                    },
                                    "uf_2": {
                                        "type": "integer"
                                    },
                                    "uf_3": {
                                        "type": "integer"
                                    },
                                    "uf_4": {
                                        "type": "integer"
                                    },
                                    "calibre_mm": {
                                        "type": "number"
                                    }
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "campo": {
                                                    "$ref": "#/components/schemas/CampoTricoscopia"
                                                },
                                                "calculo": {
                                                    "$ref": "#/components/schemas/CalculoCampo"
                                                },
                                                "medias": {
                                                    "type": "object"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    }
                }
            }
        },
        "/validacoes": {
            "get": {
                "tags": [
                    "Validação médica"
                ],
                "operationId": "m1FilaValidacao",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "ver",
                "summary": "Fila de validação",
                "description": "Itens à espera de decisão, até 200, com urgentes à frente (triagem, alarmes, alertas de gravidade alta) e depois os mais antigos: propostas da IA pendentes (sem os resumos), respostas por validar, pré-avaliações (as só de leads apenas para quem edita a ficha clínica), alertas relatados por validar e consultas por assinar (os médicos veem as suas; com âmbito «todos», todas). Só pacientes no âmbito clínico; só nome e número do paciente. meta.contadores dá o número por tipo. Tipo desconhecido → todos os tipos. Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "parameters": [
                    {
                        "name": "tipo",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "proposta",
                                "resposta",
                                "pre_avaliacao",
                                "alerta",
                                "consulta"
                            ]
                        },
                        "description": "Filtrar por tipo"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/M1ItemValidacao"
                                            }
                                        },
                                        "meta": {
                                            "type": "object",
                                            "properties": {
                                                "total": {
                                                    "type": "integer"
                                                },
                                                "contadores": {
                                                    "$ref": "#/components/schemas/M1ContadoresValidacao"
                                                }
                                            }
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "tipo": "resposta",
                                            "tipo_rotulo": "Resposta",
                                            "id": 5120,
                                            "chave": "resposta:5120",
                                            "paciente_id": 1204,
                                            "paciente_nome": "Rui Almeida",
                                            "paciente_numero": "P-2026-0311",
                                            "lead_id": null,
                                            "titulo": "Questionário prévio — FUE",
                                            "subtitulo": "Paciente · 7 pontos",
                                            "data": "2026-10-27T18:02:00+00:00",
                                            "urgente": true,
                                            "extra": {
                                                "fotos": 0,
                                                "devolvida": false
                                            }
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/validacoes/alertas/{id}/decisao": {
            "post": {
                "tags": [
                    "Validação médica"
                ],
                "operationId": "m1DecidirAlerta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do alerta (pacientes_alertas)"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Aceitar ou recusar um alerta relatado",
                "description": "«aceite» valida o alerta (fica ativo e passa a contar na elegibilidade e no cabeçalho da ficha); «recusado» desativa-o. Regista quem decidiu e quando. Efeitos: auditoria «aprovar». Paciente fora do âmbito: 403 «sem_permissao» com erro.paciente_id (a app oferece o acesso de emergência). Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "decisao": {
                                        "type": "string",
                                        "enum": [
                                            "aceite",
                                            "recusado"
                                        ]
                                    }
                                },
                                "required": [
                                    "decisao"
                                ]
                            },
                            "example": {
                                "decisao": "aceite"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "decisao": {
                                                    "type": "string",
                                                    "enum": [
                                                        "aceite",
                                                        "recusado"
                                                    ]
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 55,
                                        "decisao": "aceite"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/validacoes/desempenho": {
            "get": {
                "tags": [
                    "Validação médica"
                ],
                "operationId": "m1DesempenhoIa",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "ver",
                "summary": "Revisão do desempenho da IA",
                "description": "Num período (por omissão os últimos 90 dias): concordância (aceites ÷ decididas, em %), correções e recusas, por tipo de proposta e por modelo, e a evolução semanal da concordância. Só propostas de pacientes no âmbito clínico de quem pede. Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "parameters": [
                    {
                        "name": "de",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Desde (AAAA-MM-DD)"
                    },
                    {
                        "name": "ate",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "format": "date"
                        },
                        "description": "Até (AAAA-MM-DD; por omissão hoje)"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1DesempenhoIa"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "de": "2026-07-31",
                                        "ate": "2026-10-29",
                                        "totais": {
                                            "pendente": 4,
                                            "aceite": 61,
                                            "corrigida": 12,
                                            "recusada": 7,
                                            "decididas": 80,
                                            "concordancia": 76.3
                                        },
                                        "por_tipo": [
                                            {
                                                "chave": "escriba",
                                                "rotulo": "Escriba",
                                                "pendente": 3,
                                                "aceite": 48,
                                                "corrigida": 9,
                                                "recusada": 4,
                                                "decididas": 61,
                                                "total": 64,
                                                "concordancia": 78.7
                                            }
                                        ],
                                        "serie": [
                                            {
                                                "x": "2026-43",
                                                "y": 80,
                                                "serie": "Concordância"
                                            }
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/validacoes/respostas/{id}/decisao": {
            "post": {
                "tags": [
                    "Validação médica"
                ],
                "operationId": "m1DecidirResposta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da resposta (formularios_respostas)"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Validar ou rejeitar uma resposta",
                "description": "Só respostas «por_validar» (senão 422). «validado» faz a resposta entrar na ficha e valida os alertas relatados nela; «rejeitado» desativa esses alertas. Fecha a tarefa de revisão médica ligada. Efeitos: linha do tempo (com paciente), auditoria «aprovar» com o motivo (até 400 caracteres). Paciente fora do âmbito: 403 «sem_permissao» com erro.paciente_id (a app oferece o acesso de emergência). Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "decisao": {
                                        "type": "string",
                                        "enum": [
                                            "validado",
                                            "rejeitado"
                                        ]
                                    },
                                    "motivo": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "maxLength": 400
                                    }
                                },
                                "required": [
                                    "decisao"
                                ]
                            },
                            "example": {
                                "decisao": "validado"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "id": {
                                                    "type": "integer"
                                                },
                                                "estado": {
                                                    "type": "string",
                                                    "enum": [
                                                        "validado",
                                                        "rejeitado"
                                                    ]
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 5120,
                                        "estado": "validado"
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/validacoes/respostas/{id}/devolver": {
            "post": {
                "tags": [
                    "Validação médica"
                ],
                "operationId": "m1DevolverResposta",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador da resposta (formularios_respostas)"
                    },
                    {
                        "$ref": "#/components/parameters/IdempotencyKey"
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "editar",
                "summary": "Devolver ao paciente com pedido de informação",
                "description": "Só respostas «por_validar» que não foram gravadas pela equipa (senão 422). A resposta volta a «pendente» com uma ligação nova (prazo das definições de formulários, 14 dias por omissão); o pedido (1 a 2000 caracteres, cifrado) aparece no topo do formulário, nunca na mensagem. Canal email, sms ou whatsapp envia a mensagem de serviço sem conteúdo clínico; «ligacao» só devolve a ligação; outro valor → email. expira_em vem em ISO 8601. Efeitos: auditoria «enviar». Paciente fora do âmbito: 403 «sem_permissao» com erro.paciente_id (a app oferece o acesso de emergência). Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "pedido": {
                                        "type": "string",
                                        "minLength": 1,
                                        "maxLength": 2000
                                    },
                                    "canal": {
                                        "type": "string",
                                        "enum": [
                                            "email",
                                            "sms",
                                            "whatsapp",
                                            "ligacao"
                                        ],
                                        "default": "email"
                                    }
                                },
                                "required": [
                                    "pedido"
                                ]
                            },
                            "example": {
                                "pedido": "Indique a dose e há quanto tempo toma o anticoagulante.",
                                "canal": "email"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1PedidoFormulario"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "id": 5120,
                                        "ligacao": "https://clinica.exemplo.pt/formulario/q3V9k1sXw7bE2mN4tR8yU0pL6aZ5cH1dF9gJ3kM2nB4",
                                        "expira_em": "2026-11-12T09:40:00+00:00",
                                        "envio": {
                                            "ok": true,
                                            "estado": "enviada",
                                            "motivo": null,
                                            "mensagem_id": 66102
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "422": {
                        "$ref": "#/components/responses/ErroValidacao"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/validacoes/{tipo}/{id}": {
            "get": {
                "tags": [
                    "Validação médica"
                ],
                "operationId": "m1DetalheValidacao",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-nivel": "ver",
                "summary": "Detalhe de um item da fila",
                "description": "Com o conteúdo clínico: a proposta (com pode_decidir), a resposta legível (itens, pontuação e faixa, alarme, fotografias, propostas de triagem ligadas), o alerta ou a consulta (com as permissões). Tipo fora da lista → 404. Itens só de leads exigem «editar» em ficha.clinica. Leitura auditada («ver» na tabela do item). Paciente fora do âmbito: 403 «sem_permissao» com erro.paciente_id (a app oferece o acesso de emergência). Limite (por omissão): 120 pedidos por minuto por token de acesso (cabeçalhos X-RateLimit-Limit/-Remaining/-Reset; acima disso 429 com Retry-After).",
                "parameters": [
                    {
                        "name": "tipo",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "proposta",
                                "resposta",
                                "pre_avaliacao",
                                "alerta",
                                "consulta"
                            ]
                        },
                        "example": "resposta"
                    },
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "description": "Identificador do item"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "$ref": "#/components/schemas/M1DetalheValidacao"
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        },
        "/webhooks/eventos": {
            "get": {
                "tags": [
                    "Integrações"
                ],
                "operationId": "listarEventosDeWebhook",
                "summary": "Catálogo de eventos de webhook",
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "ver",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "evento": {
                                                        "type": "string"
                                                    },
                                                    "descricao": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": [
                                        {
                                            "evento": "lead.criado",
                                            "descricao": "Lead criado"
                                        }
                                    ]
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    }
                }
            }
        },
        "/webhooks/{id}/testar": {
            "post": {
                "tags": [
                    "Integrações"
                ],
                "operationId": "testarWebhook",
                "summary": "Enviar entrega de teste",
                "description": "Envia já o evento «webhook.teste», assinado, e devolve o resultado (código HTTP, duração, erro). Não conta para as falhas seguidas do destino.",
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-nivel": "editar",
                "security": [
                    {
                        "utilizador": []
                    }
                ],
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 12,
                        "description": "Identificador"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Sucesso",
                        "headers": {
                            "X-Request-Id": {
                                "$ref": "#/components/headers/XRequestId"
                            }
                        },
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "required": [
                                        "ok",
                                        "dados"
                                    ],
                                    "properties": {
                                        "ok": {
                                            "const": true
                                        },
                                        "dados": {
                                            "type": "object",
                                            "properties": {
                                                "ok": {
                                                    "type": "boolean"
                                                },
                                                "estado": {
                                                    "type": "string"
                                                },
                                                "codigo_http": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                },
                                                "duracao_ms": {
                                                    "type": [
                                                        "integer",
                                                        "null"
                                                    ]
                                                },
                                                "erro": {
                                                    "type": [
                                                        "string",
                                                        "null"
                                                    ]
                                                },
                                                "entrega_id": {
                                                    "type": "integer"
                                                }
                                            }
                                        },
                                        "meta": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "example": {
                                    "ok": true,
                                    "dados": {
                                        "ok": true,
                                        "estado": "entregue",
                                        "codigo_http": 204,
                                        "duracao_ms": 182,
                                        "erro": null,
                                        "entrega_id": 1843
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/NaoAutenticado"
                    },
                    "403": {
                        "$ref": "#/components/responses/SemPermissao"
                    },
                    "404": {
                        "$ref": "#/components/responses/NaoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteExcedido"
                    }
                }
            }
        }
    },
    "webhooks": {
        "marcacao.criada": {
            "post": {
                "summary": "Marcação criada",
                "description": "Uma marcação foi criada (pela equipa ou pela API, pelo portal, pelo site, pelo agente, a partir da lista de espera ou como resultado de uma remarcação — neste caso, o evento é da marcação nova). Os blocos cirúrgicos reservados no mapa de cirurgias não disparam este evento: o ciclo da cirurgia termina em cirurgia.fechada.",
                "tags": [
                    "Agenda"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "marcacao.criada"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "id",
                                            "tipo_chave",
                                            "inicio",
                                            "fim",
                                            "estado",
                                            "origem"
                                        ],
                                        "properties": {
                                            "id": {
                                                "type": "integer"
                                            },
                                            "paciente_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "lead_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "tipo_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "tipo_chave": {
                                                "type": "string"
                                            },
                                            "profissional_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "inicio": {
                                                "type": "string",
                                                "format": "date-time"
                                            },
                                            "fim": {
                                                "type": "string",
                                                "format": "date-time"
                                            },
                                            "estado": {
                                                "type": "string",
                                                "enum": [
                                                    "pedido",
                                                    "marcada",
                                                    "confirmada",
                                                    "em_curso",
                                                    "concluida",
                                                    "faltou",
                                                    "cancelada",
                                                    "remarcada"
                                                ]
                                            },
                                            "origem": {
                                                "type": "string",
                                                "enum": [
                                                    "equipa",
                                                    "portal",
                                                    "site",
                                                    "agente",
                                                    "telefone"
                                                ]
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "marcacao.criada",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "id": 418,
                                    "paciente_id": 12,
                                    "lead_id": null,
                                    "tipo_id": 1,
                                    "tipo_chave": "primeira_consulta",
                                    "profissional_id": 4,
                                    "inicio": "2026-11-03T10:00:00+00:00",
                                    "fim": "2026-11-03T10:45:00+00:00",
                                    "estado": "marcada",
                                    "origem": "portal"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "marcacao.confirmada": {
            "post": {
                "summary": "Marcação confirmada",
                "description": "A marcação passou a confirmada: pela equipa (por exemplo, depois de um telefonema), pelo paciente na página pública da marcação ou no portal, ou por resposta ao lembrete.",
                "tags": [
                    "Agenda"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "marcacao.confirmada"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "id",
                                            "tipo_chave",
                                            "inicio",
                                            "fim",
                                            "estado",
                                            "origem"
                                        ],
                                        "properties": {
                                            "id": {
                                                "type": "integer"
                                            },
                                            "paciente_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "lead_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "tipo_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "tipo_chave": {
                                                "type": "string"
                                            },
                                            "profissional_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "inicio": {
                                                "type": "string",
                                                "format": "date-time"
                                            },
                                            "fim": {
                                                "type": "string",
                                                "format": "date-time"
                                            },
                                            "estado": {
                                                "type": "string",
                                                "enum": [
                                                    "pedido",
                                                    "marcada",
                                                    "confirmada",
                                                    "em_curso",
                                                    "concluida",
                                                    "faltou",
                                                    "cancelada",
                                                    "remarcada"
                                                ]
                                            },
                                            "origem": {
                                                "type": "string",
                                                "enum": [
                                                    "equipa",
                                                    "portal",
                                                    "site",
                                                    "agente",
                                                    "telefone"
                                                ]
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "marcacao.confirmada",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "id": 418,
                                    "paciente_id": 12,
                                    "lead_id": null,
                                    "tipo_id": 1,
                                    "tipo_chave": "primeira_consulta",
                                    "profissional_id": 4,
                                    "inicio": "2026-11-03T10:00:00+00:00",
                                    "fim": "2026-11-03T10:45:00+00:00",
                                    "estado": "confirmada",
                                    "origem": "portal"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "marcacao.cancelada": {
            "post": {
                "summary": "Marcação cancelada",
                "description": "A marcação foi cancelada pela equipa, pelo paciente (página pública ou portal) ou pelo sistema (libertação automática de vagas sem confirmação, quando ligada nas Definições). O motivo do cancelamento não é enviado.",
                "tags": [
                    "Agenda"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "marcacao.cancelada"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "id",
                                            "tipo_chave",
                                            "inicio",
                                            "fim",
                                            "estado",
                                            "origem"
                                        ],
                                        "properties": {
                                            "id": {
                                                "type": "integer"
                                            },
                                            "paciente_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "lead_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "tipo_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "tipo_chave": {
                                                "type": "string"
                                            },
                                            "profissional_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "inicio": {
                                                "type": "string",
                                                "format": "date-time"
                                            },
                                            "fim": {
                                                "type": "string",
                                                "format": "date-time"
                                            },
                                            "estado": {
                                                "type": "string",
                                                "enum": [
                                                    "pedido",
                                                    "marcada",
                                                    "confirmada",
                                                    "em_curso",
                                                    "concluida",
                                                    "faltou",
                                                    "cancelada",
                                                    "remarcada"
                                                ]
                                            },
                                            "origem": {
                                                "type": "string",
                                                "enum": [
                                                    "equipa",
                                                    "portal",
                                                    "site",
                                                    "agente",
                                                    "telefone"
                                                ]
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "marcacao.cancelada",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "id": 418,
                                    "paciente_id": 12,
                                    "lead_id": null,
                                    "tipo_id": 1,
                                    "tipo_chave": "primeira_consulta",
                                    "profissional_id": 4,
                                    "inicio": "2026-11-03T10:00:00+00:00",
                                    "fim": "2026-11-03T10:45:00+00:00",
                                    "estado": "cancelada",
                                    "origem": "portal"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "cirurgia.fechada": {
            "post": {
                "summary": "Cirurgia fechada",
                "description": "A sessão cirúrgica foi fechada no painel cirúrgico (fecho definitivo, com dupla confirmação). Leva só identificadores e horas; as contagens de enxertos, a técnica e a transecção consultam-se em GET /bloco/cirurgias/{id} com as permissões de quem pergunta.",
                "tags": [
                    "Bloco operatório"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "cirurgia.fechada"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "id",
                                            "numero",
                                            "paciente_id",
                                            "fim_real"
                                        ],
                                        "properties": {
                                            "id": {
                                                "type": "integer"
                                            },
                                            "numero": {
                                                "type": "string"
                                            },
                                            "paciente_id": {
                                                "type": "integer"
                                            },
                                            "episodio_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "inicio_real": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "format": "date-time"
                                            },
                                            "fim_real": {
                                                "type": "string",
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "cirurgia.fechada",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "id": 37,
                                    "numero": "CIR-2026-0037",
                                    "paciente_id": 12,
                                    "episodio_id": 9,
                                    "inicio_real": "2026-11-10T08:12:00+00:00",
                                    "fim_real": "2026-11-10T15:47:00+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "paciente.criado": {
            "post": {
                "summary": "Paciente criado",
                "description": "Um paciente novo entrou no registo único da clínica (formulário da equipa, conversão de um lead, pré-avaliação, agente ou importação de ficheiro — um evento por paciente importado). Quando a criação encontra um duplicado forte e reutiliza o paciente existente, o evento não é disparado.",
                "tags": [
                    "Ficha do paciente"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "paciente.criado"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "id",
                                            "numero",
                                            "criado_em"
                                        ],
                                        "properties": {
                                            "id": {
                                                "type": "integer"
                                            },
                                            "numero": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "description": "Número de processo da clínica"
                                            },
                                            "origem": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "enum": [
                                                    "site",
                                                    "pre_avaliacao",
                                                    "recomendacao",
                                                    "telefone",
                                                    "presencial",
                                                    "redes",
                                                    "agente",
                                                    "importacao",
                                                    "outro",
                                                    null
                                                ]
                                            },
                                            "lead_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "criado_em": {
                                                "type": "string",
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "paciente.criado",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "id": 1204,
                                    "numero": "P-2026-01204",
                                    "origem": "pre_avaliacao",
                                    "lead_id": 3381,
                                    "criado_em": "2026-10-28T10:12:44+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "paciente.fundido": {
            "post": {
                "summary": "Pacientes fundidos",
                "description": "Dois registos da mesma pessoa foram fundidos. Todas as linhas do paciente removido (episódios, consultas, formulários, marcações, documentos, pagamentos…) passaram para o paciente mantido; o removido ficou arquivado e apagado logicamente. Atualize no seu sistema as referências a «removido_id».",
                "tags": [
                    "Ficha do paciente"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "paciente.fundido"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "manter_id",
                                            "removido_id",
                                            "fundido_em"
                                        ],
                                        "properties": {
                                            "manter_id": {
                                                "type": "integer"
                                            },
                                            "removido_id": {
                                                "type": "integer"
                                            },
                                            "fundido_em": {
                                                "type": "string",
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "paciente.fundido",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "manter_id": 1204,
                                    "removido_id": 1388,
                                    "fundido_em": "2026-10-28T15:30:02+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "episodio.aberto": {
            "post": {
                "summary": "Episódio de tratamento aberto",
                "description": "Abriu-se um episódio de tratamento para um paciente (por exemplo, ao criar a primeira consulta sem episódio ativo, ao converter um lead ou pela lista de episódios). A etapa da jornada começa em 2 (pré-avaliação) quando vem de um lead e em 3 (consulta) nos restantes casos.",
                "tags": [
                    "Ficha do paciente"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "episodio.aberto"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "id",
                                            "paciente_id",
                                            "estado",
                                            "etapa_jornada"
                                        ],
                                        "properties": {
                                            "id": {
                                                "type": "integer"
                                            },
                                            "numero": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            },
                                            "paciente_id": {
                                                "type": "integer"
                                            },
                                            "estado": {
                                                "type": "string",
                                                "enum": [
                                                    "avaliacao",
                                                    "plano",
                                                    "proposta",
                                                    "agendado",
                                                    "pre_operatorio",
                                                    "cirurgia",
                                                    "pos_operatorio",
                                                    "acompanhamento",
                                                    "concluido",
                                                    "cancelado"
                                                ]
                                            },
                                            "etapa_jornada": {
                                                "type": "integer",
                                                "minimum": 1,
                                                "maximum": 9
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "episodio.aberto",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "id": 77,
                                    "numero": "E-2026-0077",
                                    "paciente_id": 1204,
                                    "estado": "avaliacao",
                                    "etapa_jornada": 3
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "episodio.estado_alterado": {
            "post": {
                "summary": "Estado do episódio alterado",
                "description": "O episódio mudou de estado e, com ele, de etapa da jornada (avaliacao 3 · plano 4 · proposta 5 · agendado e pre_operatorio 6 · cirurgia 7 · pos_operatorio 8 · acompanhamento e concluido 9; «cancelado» mantém a etapa). Acontece, por exemplo, quando o médico valida a viabilidade na consulta («viável» → plano; «não viável» → cancelado), pela ação «Mudar estado» ou nos fluxos de outros módulos (proposta aceite, cirurgia fechada). Cada mudança abre as tarefas automáticas configuradas e avisa o departamento seguinte.",
                "tags": [
                    "Ficha do paciente"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "episodio.estado_alterado"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "id",
                                            "paciente_id",
                                            "anterior",
                                            "estado",
                                            "etapa_jornada",
                                            "alterado_em"
                                        ],
                                        "properties": {
                                            "id": {
                                                "type": "integer"
                                            },
                                            "numero": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            },
                                            "paciente_id": {
                                                "type": "integer"
                                            },
                                            "anterior": {
                                                "type": "string"
                                            },
                                            "estado": {
                                                "type": "string",
                                                "enum": [
                                                    "avaliacao",
                                                    "plano",
                                                    "proposta",
                                                    "agendado",
                                                    "pre_operatorio",
                                                    "cirurgia",
                                                    "pos_operatorio",
                                                    "acompanhamento",
                                                    "concluido",
                                                    "cancelado"
                                                ]
                                            },
                                            "etapa_jornada": {
                                                "type": "integer",
                                                "minimum": 1,
                                                "maximum": 9
                                            },
                                            "alterado_em": {
                                                "type": "string",
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "episodio.estado_alterado",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "id": 77,
                                    "numero": "E-2026-0077",
                                    "paciente_id": 1204,
                                    "anterior": "avaliacao",
                                    "estado": "plano",
                                    "etapa_jornada": 4,
                                    "alterado_em": "2026-10-28T11:05:19+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "consulta.assinada": {
            "post": {
                "summary": "Consulta assinada",
                "description": "Um médico assinou a consulta. A partir daqui o registo fica fechado (selado com a impressão digital SHA-256 do conteúdo) e só aceita aditamentos. O evento não leva o conteúdo clínico: para o ler, use GET /consultas/{id} com as permissões clínicas.",
                "tags": [
                    "Consultas"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "consulta.assinada"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "id",
                                            "paciente_id",
                                            "tipo",
                                            "assinada_em"
                                        ],
                                        "properties": {
                                            "id": {
                                                "type": "integer"
                                            },
                                            "paciente_id": {
                                                "type": "integer"
                                            },
                                            "episodio_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "tipo": {
                                                "type": "string",
                                                "enum": [
                                                    "primeira",
                                                    "avaliacao",
                                                    "controlo",
                                                    "teleconsulta",
                                                    "pre_operatoria"
                                                ]
                                            },
                                            "assinada_em": {
                                                "type": "string",
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "consulta.assinada",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "id": 940,
                                    "paciente_id": 1204,
                                    "episodio_id": 77,
                                    "tipo": "primeira",
                                    "assinada_em": "2026-10-28T11:02:40+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "formulario.respondido": {
            "post": {
                "summary": "Formulário respondido",
                "description": "Chegou uma resposta a um formulário da clínica: preenchida pela equipa (fica validada), pelo paciente através da ligação ou do portal, pelo agente ou pelo site (ficam «por_validar» até um profissional decidir). «alarme» indica que pelo menos uma resposta corresponde a um sinal de alarme definido no formulário (a equipa já foi avisada com uma tarefa urgente). As respostas em si nunca saem no evento.",
                "tags": [
                    "Formulários"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "formulario.respondido"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "resposta_id",
                                            "formulario_id",
                                            "tipo",
                                            "estado",
                                            "alarme",
                                            "respondido_em"
                                        ],
                                        "properties": {
                                            "resposta_id": {
                                                "type": "integer"
                                            },
                                            "formulario_id": {
                                                "type": "integer"
                                            },
                                            "tipo": {
                                                "type": "string",
                                                "enum": [
                                                    "anamnese",
                                                    "questionario_previo",
                                                    "seguimento",
                                                    "satisfacao",
                                                    "pre_avaliacao",
                                                    "tecnica",
                                                    "triagem_sintomas",
                                                    "outro"
                                                ]
                                            },
                                            "paciente_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "lead_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "estado": {
                                                "type": "string",
                                                "enum": [
                                                    "por_validar",
                                                    "validado"
                                                ]
                                            },
                                            "alarme": {
                                                "type": "boolean"
                                            },
                                            "respondido_em": {
                                                "type": "string",
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "formulario.respondido",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "resposta_id": 5120,
                                    "formulario_id": 31,
                                    "tipo": "questionario_previo",
                                    "paciente_id": 1204,
                                    "lead_id": null,
                                    "estado": "por_validar",
                                    "alarme": false,
                                    "respondido_em": "2026-10-29T08:47:13+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "proposta.enviada": {
            "post": {
                "summary": "Proposta enviada",
                "description": "Primeiro envio de uma proposta selada ao paciente (os reenvios não disparam o evento).",
                "tags": [
                    "Comercial"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "proposta.enviada"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "proposta_id",
                                            "numero",
                                            "estado",
                                            "total",
                                            "moeda"
                                        ],
                                        "properties": {
                                            "proposta_id": {
                                                "type": "integer"
                                            },
                                            "numero": {
                                                "type": "string"
                                            },
                                            "paciente_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "lead_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "episodio_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "estado": {
                                                "type": "string",
                                                "enum": [
                                                    "rascunho",
                                                    "enviada",
                                                    "vista",
                                                    "aceite",
                                                    "recusada",
                                                    "expirada"
                                                ]
                                            },
                                            "opcao": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "description": "Chave da opção aceite (só em proposta.aceite)."
                                            },
                                            "total": {
                                                "type": "number",
                                                "x-unidade": "EUR"
                                            },
                                            "moeda": {
                                                "const": "EUR"
                                            },
                                            "moeda_paciente": {
                                                "type": "string",
                                                "description": "Moeda em que a proposta foi apresentada (indicativa)."
                                            },
                                            "cambio": {
                                                "type": "number"
                                            },
                                            "aceite_em": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "format": "date-time"
                                            },
                                            "impressao_digital": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "description": "SHA-256 do conteúdo selado."
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "proposta.enviada",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "proposta_id": 57,
                                    "numero": "PR-2026-0057",
                                    "paciente_id": 12,
                                    "lead_id": 88,
                                    "episodio_id": 31,
                                    "estado": "enviada",
                                    "opcao": null,
                                    "total": 6900,
                                    "moeda": "EUR",
                                    "moeda_paciente": "EUR",
                                    "cambio": 1,
                                    "aceite_em": null,
                                    "impressao_digital": "9f2c4e1a7b3d5f60c8a9e2b4d6f8a0c1e3b5d7f9a1c3e5b7d9f1a3c5e7b9d1f3"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "proposta.aceite": {
            "post": {
                "summary": "Proposta aceite",
                "description": "O paciente aceitou a proposta pela ligação pessoal, no portal ou presencialmente. Envia a opção aceite; o plano de pagamentos já foi criado.",
                "tags": [
                    "Comercial"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "proposta.aceite"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "proposta_id",
                                            "numero",
                                            "estado",
                                            "total",
                                            "moeda"
                                        ],
                                        "properties": {
                                            "proposta_id": {
                                                "type": "integer"
                                            },
                                            "numero": {
                                                "type": "string"
                                            },
                                            "paciente_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "lead_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "episodio_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "estado": {
                                                "type": "string",
                                                "enum": [
                                                    "rascunho",
                                                    "enviada",
                                                    "vista",
                                                    "aceite",
                                                    "recusada",
                                                    "expirada"
                                                ]
                                            },
                                            "opcao": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "description": "Chave da opção aceite (só em proposta.aceite)."
                                            },
                                            "total": {
                                                "type": "number",
                                                "x-unidade": "EUR"
                                            },
                                            "moeda": {
                                                "const": "EUR"
                                            },
                                            "moeda_paciente": {
                                                "type": "string",
                                                "description": "Moeda em que a proposta foi apresentada (indicativa)."
                                            },
                                            "cambio": {
                                                "type": "number"
                                            },
                                            "aceite_em": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "format": "date-time"
                                            },
                                            "impressao_digital": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "description": "SHA-256 do conteúdo selado."
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "proposta.aceite",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "estado": "aceite",
                                    "opcao": "recomendada",
                                    "aceite_em": "2026-11-04T16:20:11+00:00",
                                    "proposta_id": 57,
                                    "numero": "PR-2026-0057",
                                    "paciente_id": 12,
                                    "lead_id": 88,
                                    "episodio_id": 31,
                                    "total": 6900,
                                    "moeda": "EUR",
                                    "moeda_paciente": "EUR",
                                    "cambio": 1,
                                    "impressao_digital": "9f2c4e1a7b3d5f60c8a9e2b4d6f8a0c1e3b5d7f9a1c3e5b7d9f1a3c5e7b9d1f3"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "proposta.recusada": {
            "post": {
                "summary": "Proposta recusada",
                "description": "A proposta foi recusada pelo paciente ou registada como recusada pela equipa. Inclui o motivo indicado (texto livre, sem dados clínicos).",
                "tags": [
                    "Comercial"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "proposta.recusada"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "proposta_id",
                                            "numero",
                                            "estado",
                                            "total",
                                            "moeda"
                                        ],
                                        "properties": {
                                            "proposta_id": {
                                                "type": "integer"
                                            },
                                            "numero": {
                                                "type": "string"
                                            },
                                            "paciente_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "lead_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "episodio_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "estado": {
                                                "type": "string",
                                                "enum": [
                                                    "rascunho",
                                                    "enviada",
                                                    "vista",
                                                    "aceite",
                                                    "recusada",
                                                    "expirada"
                                                ]
                                            },
                                            "opcao": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "description": "Chave da opção aceite (só em proposta.aceite)."
                                            },
                                            "total": {
                                                "type": "number",
                                                "x-unidade": "EUR"
                                            },
                                            "moeda": {
                                                "const": "EUR"
                                            },
                                            "moeda_paciente": {
                                                "type": "string",
                                                "description": "Moeda em que a proposta foi apresentada (indicativa)."
                                            },
                                            "cambio": {
                                                "type": "number"
                                            },
                                            "aceite_em": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "format": "date-time"
                                            },
                                            "impressao_digital": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "description": "SHA-256 do conteúdo selado."
                                            },
                                            "motivo": {
                                                "type": "string"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "proposta.recusada",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "estado": "recusada",
                                    "motivo": "Prefere adiar para o próximo ano.",
                                    "proposta_id": 57,
                                    "numero": "PR-2026-0057",
                                    "paciente_id": 12,
                                    "lead_id": 88,
                                    "episodio_id": 31,
                                    "opcao": null,
                                    "total": 6900,
                                    "moeda": "EUR",
                                    "moeda_paciente": "EUR",
                                    "cambio": 1,
                                    "aceite_em": null,
                                    "impressao_digital": "9f2c4e1a7b3d5f60c8a9e2b4d6f8a0c1e3b5d7f9a1c3e5b7d9f1a3c5e7b9d1f3"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "pagamento.recebido": {
            "post": {
                "summary": "Pagamento recebido",
                "description": "Um pagamento passou a pago: confirmado pelo fornecedor (aviso ou consulta) ou marcado como pago pela equipa (caixa, transferência).",
                "tags": [
                    "Comercial"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "pagamento.recebido"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "pagamento_id",
                                            "tipo",
                                            "valor",
                                            "moeda"
                                        ],
                                        "properties": {
                                            "pagamento_id": {
                                                "type": "integer"
                                            },
                                            "paciente_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "episodio_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "proposta_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "tipo": {
                                                "type": "string",
                                                "enum": [
                                                    "sinal",
                                                    "intercalar",
                                                    "restante",
                                                    "consulta",
                                                    "teleconsulta",
                                                    "tratamento",
                                                    "outro",
                                                    "adiantamento",
                                                    "pre_pagamento",
                                                    "vale",
                                                    "comparticipacao"
                                                ]
                                            },
                                            "metodo": {
                                                "type": "string",
                                                "enum": [
                                                    "mbway",
                                                    "multibanco",
                                                    "cartao",
                                                    "numerario",
                                                    "transferencia",
                                                    "ligacao",
                                                    "financiamento",
                                                    "carteira",
                                                    "vale"
                                                ],
                                                "description": "«carteira» e «vale»: liquidado com saldo da carteira ou com vale (não é dinheiro novo)."
                                            },
                                            "valor": {
                                                "type": "number",
                                                "x-unidade": "EUR"
                                            },
                                            "moeda": {
                                                "const": "EUR"
                                            },
                                            "pago_em": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "format": "date-time"
                                            },
                                            "confirmacao": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "enum": [
                                                    "callback",
                                                    "api",
                                                    "manual",
                                                    null
                                                ]
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "pagamento.recebido",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "pagamento_id": 204,
                                    "paciente_id": 12,
                                    "episodio_id": 31,
                                    "proposta_id": 57,
                                    "tipo": "sinal",
                                    "metodo": "mbway",
                                    "valor": 1380,
                                    "moeda": "EUR",
                                    "pago_em": "2026-11-04T16:24:52+00:00",
                                    "confirmacao": "callback"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "documento_fiscal.emitido": {
            "post": {
                "summary": "Documento fiscal emitido",
                "description": "O programa de faturação certificado emitiu um documento (fatura, fatura-recibo, fatura simplificada ou nota de crédito), ou foi registada a emissão feita noutro programa.",
                "tags": [
                    "Comercial"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "documento_fiscal.emitido"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "documento_id",
                                            "tipo",
                                            "total",
                                            "moeda"
                                        ],
                                        "properties": {
                                            "documento_id": {
                                                "type": "integer"
                                            },
                                            "tipo": {
                                                "type": "string",
                                                "enum": [
                                                    "FT",
                                                    "FR",
                                                    "FS",
                                                    "RG",
                                                    "NC"
                                                ]
                                            },
                                            "numero": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            },
                                            "atcud": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            },
                                            "paciente_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "conta_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ],
                                                "description": "Conta pagadora a quem o documento foi emitido."
                                            },
                                            "pagamento_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "total": {
                                                "type": "number",
                                                "x-unidade": "EUR"
                                            },
                                            "moeda": {
                                                "const": "EUR"
                                            },
                                            "emitido_em": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "documento_fiscal.emitido",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "documento_id": 91,
                                    "tipo": "FR",
                                    "numero": "FR A2026/118",
                                    "atcud": "JJ3KX9QW-118",
                                    "paciente_id": 12,
                                    "pagamento_id": 204,
                                    "total": 1380,
                                    "moeda": "EUR",
                                    "emitido_em": "2026-11-04T16:25:30+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "consentimento.revogado": {
            "post": {
                "summary": "Consentimento retirado",
                "description": "Um paciente ou contacto retirou um consentimento (no portal, junto da equipa ou por pedido de apagamento). Os efeitos internos (oposição a contactos, paragem de sequências, retirada de imagens publicadas) já foram aplicados quando o evento é enviado; sistemas externos que usem a mesma finalidade devem deixar de o fazer.",
                "tags": [
                    "Consentimentos"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "consentimento.revogado"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "consentimento_id",
                                            "finalidade",
                                            "revogado_em"
                                        ],
                                        "properties": {
                                            "consentimento_id": {
                                                "type": "integer"
                                            },
                                            "paciente_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "lead_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "finalidade": {
                                                "type": "string",
                                                "enum": [
                                                    "tratamento_clinico",
                                                    "fotografias_clinicas",
                                                    "imagens_comunicacao",
                                                    "captura_3d",
                                                    "gravacao_chamadas",
                                                    "gravacao_video",
                                                    "ia",
                                                    "agente_voz",
                                                    "marketing",
                                                    "partilha_terceiros",
                                                    "teleconsulta",
                                                    "cirurgico",
                                                    "contacto"
                                                ]
                                            },
                                            "revogado_em": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "consentimento.revogado",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "consentimento_id": 5610,
                                    "paciente_id": 1204,
                                    "lead_id": null,
                                    "finalidade": "marketing",
                                    "revogado_em": "2026-10-28T15:42:00+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "documento.emitido": {
            "post": {
                "summary": "Documento emitido",
                "description": "Um documento foi emitido a partir de um modelo (instruções, declaração, relatório, alta, informação de consentimento…). Não leva conteúdo; o código de verificação permite confirmar o documento em GET /conformidade/verificar/{codigo}.",
                "tags": [
                    "Documentos"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "documento.emitido"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "documento_id",
                                            "tipo",
                                            "codigo_verificacao",
                                            "emitido_em"
                                        ],
                                        "properties": {
                                            "documento_id": {
                                                "type": "integer"
                                            },
                                            "numero": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            },
                                            "tipo": {
                                                "type": "string",
                                                "enum": [
                                                    "proposta",
                                                    "consentimento",
                                                    "instrucoes",
                                                    "declaracao",
                                                    "relatorio",
                                                    "alta",
                                                    "carta"
                                                ]
                                            },
                                            "paciente_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "codigo_verificacao": {
                                                "type": "string"
                                            },
                                            "emitido_em": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "documento.emitido",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "documento_id": 902,
                                    "numero": "DOC-2026-0142",
                                    "tipo": "instrucoes",
                                    "paciente_id": 1204,
                                    "codigo_verificacao": "K7QM-3XRA",
                                    "emitido_em": "2026-10-28T09:58:00+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "documento.assinado": {
            "post": {
                "summary": "Documento assinado",
                "description": "Um documento foi assinado: no ecrã (presencial), com código de uso único pela ligação enviada ao titular, pelo paciente no portal ou com assinatura qualificada carregada. O certificado consulta-se em GET /conformidade/documentos/{id}.",
                "tags": [
                    "Documentos"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "documento.assinado"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "documento_id",
                                            "tipo",
                                            "assinatura_tipo",
                                            "assinado_em"
                                        ],
                                        "properties": {
                                            "documento_id": {
                                                "type": "integer"
                                            },
                                            "numero": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            },
                                            "tipo": {
                                                "type": "string"
                                            },
                                            "paciente_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "assinatura_tipo": {
                                                "type": "string",
                                                "enum": [
                                                    "ecra",
                                                    "codigo",
                                                    "qualificada"
                                                ]
                                            },
                                            "assinado_em": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "documento.assinado",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "documento_id": 902,
                                    "numero": "DOC-2026-0142",
                                    "tipo": "instrucoes",
                                    "paciente_id": 1204,
                                    "assinatura_tipo": "codigo",
                                    "assinado_em": "2026-10-28T18:20:00+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "pedido_titular.recebido": {
            "post": {
                "summary": "Pedido de titular recebido",
                "description": "Foi registado um pedido de acesso, retificação, portabilidade, apagamento, oposição ou limitação (pelo portal ou pela equipa). O prazo legal de resposta começa na receção.",
                "tags": [
                    "Proteção de dados"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "pedido_titular.recebido"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "pedido_id",
                                            "tipo",
                                            "recebido_em"
                                        ],
                                        "properties": {
                                            "pedido_id": {
                                                "type": "integer"
                                            },
                                            "tipo": {
                                                "type": "string",
                                                "enum": [
                                                    "acesso",
                                                    "retificacao",
                                                    "portabilidade",
                                                    "apagamento",
                                                    "oposicao",
                                                    "limitacao"
                                                ]
                                            },
                                            "paciente_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "recebido_em": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "pedido_titular.recebido",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "pedido_id": 41,
                                    "tipo": "portabilidade",
                                    "paciente_id": 1204,
                                    "recebido_em": "2026-10-28T11:03:00+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "reclamacao.recebida": {
            "post": {
                "summary": "Reclamação, elogio ou sugestão recebida",
                "description": "Foi registada uma entrada do Livro de Reclamações (físico ou eletrónico), email, portal ou telefone, com o prazo de resposta em dias úteis. Não leva o texto nem os dados do reclamante.",
                "tags": [
                    "Proteção de dados"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "reclamacao.recebida"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "reclamacao_id",
                                            "tipo"
                                        ],
                                        "properties": {
                                            "reclamacao_id": {
                                                "type": "integer"
                                            },
                                            "numero": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            },
                                            "tipo": {
                                                "type": "string",
                                                "enum": [
                                                    "reclamacao",
                                                    "elogio",
                                                    "sugestao"
                                                ]
                                            },
                                            "canal": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "enum": [
                                                    "fisico",
                                                    "eletronico",
                                                    "email",
                                                    "portal",
                                                    "telefone",
                                                    null
                                                ]
                                            },
                                            "prazo": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "format": "date"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "reclamacao.recebida",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "reclamacao_id": 18,
                                    "numero": "REC-2026-0018",
                                    "tipo": "reclamacao",
                                    "canal": "eletronico",
                                    "prazo": "2026-11-11"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "incidente.registado": {
            "post": {
                "summary": "Incidente de segurança registado",
                "description": "Foi registado um incidente de segurança ou violação de dados. prazo_cnpd é o fim das 72 horas desde a deteção para a eventual notificação à autoridade de controlo.",
                "tags": [
                    "Proteção de dados"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "incidente.registado"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "incidente_id"
                                        ],
                                        "properties": {
                                            "incidente_id": {
                                                "type": "integer"
                                            },
                                            "gravidade": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "enum": [
                                                    "baixa",
                                                    "media",
                                                    "alta",
                                                    "critica",
                                                    null
                                                ]
                                            },
                                            "detetado_em": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "format": "date-time"
                                            },
                                            "prazo_cnpd": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "incidente.registado",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "incidente_id": 3,
                                    "gravidade": "alta",
                                    "detetado_em": "2026-10-28T08:15:00+00:00",
                                    "prazo_cnpd": "2026-10-31T08:15:00+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "lead.criado": {
            "post": {
                "summary": "Lead criado",
                "description": "Entrou um lead novo (site, anúncio, mensagem, chamada, agente de voz ou criado pela equipa). Quando o contacto já existia como lead em curso com o mesmo telefone ou email, não há evento novo: o lead existente é atualizado.",
                "tags": [
                    "Funil e leads"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "lead.criado"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "id",
                                            "origem",
                                            "criado_em"
                                        ],
                                        "properties": {
                                            "id": {
                                                "type": "integer"
                                            },
                                            "origem": {
                                                "type": "string",
                                                "enum": [
                                                    "site",
                                                    "pre_avaliacao",
                                                    "meta",
                                                    "google",
                                                    "whatsapp",
                                                    "instagram",
                                                    "messenger",
                                                    "telefone",
                                                    "presencial",
                                                    "recomendacao",
                                                    "agente_voz",
                                                    "outro"
                                                ]
                                            },
                                            "fase": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "description": "Chave da fase (ex.: novo)."
                                            },
                                            "campanha": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            },
                                            "utm": {
                                                "type": "object",
                                                "properties": {
                                                    "source": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "medium": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "campaign": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "term": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "content": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    }
                                                }
                                            },
                                            "procedimento_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "responsavel_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "idioma": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            },
                                            "pontuacao": {
                                                "type": "integer",
                                                "minimum": 0,
                                                "maximum": 100
                                            },
                                            "criado_em": {
                                                "type": "string",
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "lead.criado",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "id": 812,
                                    "origem": "meta",
                                    "fase": "novo",
                                    "campanha": "capilar-outono",
                                    "utm": {
                                        "source": "facebook",
                                        "medium": "cpc",
                                        "campaign": "capilar-outono",
                                        "term": null,
                                        "content": "video-15s"
                                    },
                                    "procedimento_id": 3,
                                    "responsavel_id": 14,
                                    "idioma": "pt-PT",
                                    "pontuacao": 40,
                                    "criado_em": "2026-10-28T08:47:00+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "lead.fase_alterada": {
            "post": {
                "summary": "Lead mudou de fase",
                "description": "O lead passou para outra fase do funil (arrastado no quadro, pela API, pelo resultado de uma chamada ou automaticamente quando o médico valida a viabilidade). Nas fases do tipo «perdida» inclui o motivo de perda. Útil para devolver conversões às plataformas de anúncios.",
                "tags": [
                    "Funil e leads"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "lead.fase_alterada"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "lead_id",
                                            "fase",
                                            "fase_tipo",
                                            "em"
                                        ],
                                        "properties": {
                                            "lead_id": {
                                                "type": "integer"
                                            },
                                            "fase": {
                                                "type": "string",
                                                "description": "Chave da nova fase."
                                            },
                                            "fase_tipo": {
                                                "type": "string",
                                                "enum": [
                                                    "aberta",
                                                    "ganha",
                                                    "perdida"
                                                ]
                                            },
                                            "motivo_perda": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "enum": [
                                                    "preco",
                                                    "prazo",
                                                    "concorrencia",
                                                    "nao_elegivel",
                                                    "sem_resposta",
                                                    "outro",
                                                    null
                                                ]
                                            },
                                            "em": {
                                                "type": "string",
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "lead.fase_alterada",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "lead_id": 812,
                                    "fase": "consulta_marcada",
                                    "fase_tipo": "aberta",
                                    "motivo_perda": null,
                                    "em": "2026-10-29T10:12:00+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "lead.convertido": {
            "post": {
                "summary": "Lead convertido em paciente",
                "description": "O lead deu origem a um paciente (criado com os dados do lead ou já existente) e foi aberto o episódio. A origem e a campanha ficam no paciente para medir o retorno do marketing.",
                "tags": [
                    "Funil e leads"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "lead.convertido"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "lead_id",
                                            "paciente_id",
                                            "convertido_em"
                                        ],
                                        "properties": {
                                            "lead_id": {
                                                "type": "integer"
                                            },
                                            "paciente_id": {
                                                "type": "integer"
                                            },
                                            "convertido_em": {
                                                "type": "string",
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "lead.convertido",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "lead_id": 812,
                                    "paciente_id": 1204,
                                    "convertido_em": "2026-10-30T16:40:00+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "campanha.enviada": {
            "post": {
                "summary": "Campanha enviada",
                "description": "Terminou o envio de uma campanha aprovada (todos os lotes processados). Os totais ficam disponíveis em GET /marketing/campanhas/{id}/estatisticas.",
                "tags": [
                    "Campanhas de marketing"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "campanha.enviada"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "campanha_id",
                                            "canal",
                                            "enviada_em"
                                        ],
                                        "properties": {
                                            "campanha_id": {
                                                "type": "integer"
                                            },
                                            "canal": {
                                                "type": "string",
                                                "enum": [
                                                    "email",
                                                    "sms",
                                                    "whatsapp"
                                                ]
                                            },
                                            "enviada_em": {
                                                "type": "string",
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "campanha.enviada",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "campanha_id": 21,
                                    "canal": "email",
                                    "enviada_em": "2026-11-03T10:24:00+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "tarefa.criada": {
            "post": {
                "summary": "Tarefa criada",
                "description": "Uma tarefa foi criada (manual, a partir do chat, pela API ou automática de outro módulo que use o serviço do M7).",
                "tags": [
                    "Tarefas"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "tarefa.criada"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "properties": {
                                            "id": {
                                                "type": "integer"
                                            },
                                            "titulo": {
                                                "type": "string"
                                            },
                                            "prioridade": {
                                                "type": "string",
                                                "enum": [
                                                    "baixa",
                                                    "normal",
                                                    "alta",
                                                    "urgente"
                                                ]
                                            },
                                            "prazo": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "format": "date-time"
                                            },
                                            "responsavel_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "origem": {
                                                "type": "string",
                                                "enum": [
                                                    "manual",
                                                    "automatica",
                                                    "mensagem",
                                                    "agente"
                                                ]
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "tarefa.criada",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "id": 87,
                                    "titulo": "Ligar à Rita Matos",
                                    "prioridade": "alta",
                                    "prazo": "2026-10-29T10:00:00+00:00",
                                    "responsavel_id": 4,
                                    "origem": "manual"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "tarefa.concluida": {
            "post": {
                "summary": "Tarefa concluída",
                "description": "Uma tarefa passou a concluída (a reabertura não dispara evento).",
                "tags": [
                    "Tarefas"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "tarefa.concluida"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "properties": {
                                            "id": {
                                                "type": "integer"
                                            },
                                            "titulo": {
                                                "type": "string"
                                            },
                                            "concluida_por": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "concluida_em": {
                                                "type": "string",
                                                "format": "date-time"
                                            },
                                            "origem": {
                                                "type": "string"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "tarefa.concluida",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "id": 87,
                                    "titulo": "Ligar à Rita Matos",
                                    "concluida_por": 4,
                                    "concluida_em": "2026-10-29T09:41:00+00:00",
                                    "origem": "manual"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "comunicado.publicado": {
            "post": {
                "summary": "Comunicado interno publicado",
                "description": "Um comunicado à equipa foi publicado. Só o título e o público — o texto fica no AnagenSys.",
                "tags": [
                    "Comunicados"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "comunicado.publicado"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "properties": {
                                            "id": {
                                                "type": "integer"
                                            },
                                            "titulo": {
                                                "type": "string"
                                            },
                                            "publico": {
                                                "type": "string",
                                                "enum": [
                                                    "todos",
                                                    "departamento",
                                                    "perfil"
                                                ]
                                            },
                                            "destino": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            },
                                            "exige_leitura": {
                                                "type": "boolean"
                                            },
                                            "publicado_em": {
                                                "type": "string",
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "comunicado.publicado",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "id": 3,
                                    "titulo": "Novo protocolo de esterilização",
                                    "publico": "departamento",
                                    "destino": "enfermagem",
                                    "exige_leitura": true,
                                    "publicado_em": "2026-10-27T08:00:00+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "exportacao.concluida": {
            "post": {
                "summary": "Exportação total pronta",
                "description": "A exportação total pedida está pronta a descarregar (pela equipa, na plataforma). O evento não leva dados nem ligações.",
                "tags": [
                    "Exportação"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "exportacao.concluida"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "properties": {
                                            "id": {
                                                "type": "integer"
                                            },
                                            "tabelas": {
                                                "type": "integer"
                                            },
                                            "tamanho": {
                                                "type": "integer",
                                                "x-unidade": "bytes"
                                            },
                                            "sha256": {
                                                "type": "string"
                                            },
                                            "expira_em": {
                                                "type": "string",
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "exportacao.concluida",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "id": 4,
                                    "tabelas": 63,
                                    "tamanho": 18452211,
                                    "sha256": "9f2c…a71b",
                                    "expira_em": "2026-11-04T03:10:00+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "webhook.teste": {
            "post": {
                "summary": "Entrega de teste",
                "description": "Enviada quando a clínica carrega em «Testar» no destino. Responda 2xx.",
                "tags": [
                    "Integrações"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "webhook.teste"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "properties": {
                                            "mensagem": {
                                                "type": "string"
                                            },
                                            "webhook_id": {
                                                "type": "integer"
                                            },
                                            "pedido_por": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "webhook.teste",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "mensagem": "Entrega de teste do AnagenSys.",
                                    "webhook_id": 2,
                                    "pedido_por": 4
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "plano.aprovado": {
            "post": {
                "summary": "Plano cirúrgico aprovado",
                "description": "Um médico aprovou uma versão do plano. A versão aprovada anterior do mesmo plano passou a «substituído». A impressão digital SHA-256 sela entrada, parâmetros, versão do motor e resultado.",
                "tags": [
                    "Planos cirúrgicos"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "plano.aprovado"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "id",
                                            "paciente_id",
                                            "versao",
                                            "impressao_digital"
                                        ],
                                        "properties": {
                                            "id": {
                                                "type": "integer"
                                            },
                                            "paciente_id": {
                                                "type": "integer"
                                            },
                                            "episodio_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "versao": {
                                                "type": "integer"
                                            },
                                            "motor_versao": {
                                                "type": "integer"
                                            },
                                            "enxertos": {
                                                "type": "integer",
                                                "x-unidade": "enxertos"
                                            },
                                            "sessoes": {
                                                "type": "integer",
                                                "x-unidade": "sessões"
                                            },
                                            "impressao_digital": {
                                                "type": "string",
                                                "pattern": "^[a-f0-9]{64}$"
                                            },
                                            "aprovado_em": {
                                                "type": "string",
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "plano.aprovado",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "id": 318,
                                    "paciente_id": 1204,
                                    "episodio_id": 77,
                                    "versao": 3,
                                    "motor_versao": 2,
                                    "enxertos": 3200,
                                    "sessoes": 2,
                                    "impressao_digital": "b1946ac92492d2347c6235b4d2611184e7a4b8f3c2d1e0f9a8b7c6d5e4f3a2b1",
                                    "aprovado_em": "2026-10-28T11:42:05+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "motor.versao_aprovada": {
            "post": {
                "summary": "Parâmetros do motor aprovados",
                "description": "A direção clínica aprovou uma versão dos parâmetros do motor de cálculo; passa a ser a usada nos cálculos novos da clínica.",
                "tags": [
                    "Motor de cálculo"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "motor.versao_aprovada"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "id",
                                            "versao"
                                        ],
                                        "properties": {
                                            "id": {
                                                "type": "integer"
                                            },
                                            "versao": {
                                                "type": "integer"
                                            },
                                            "aprovado_em": {
                                                "type": "string",
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "motor.versao_aprovada",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "id": 4,
                                    "versao": 2,
                                    "aprovado_em": "2026-10-28T09:15:00+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "marco.concluido": {
            "post": {
                "summary": "Marco do acompanhamento concluído",
                "description": "Um marco do pós-operatório (d1, s1, m1, m2, m6, m9, m12, m18) foi concluído. Inclui o índice de recomendação (NPS) quando registado — útil para convidar a avaliações online quando a satisfação é alta.",
                "tags": [
                    "Acompanhamento"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "marco.concluido"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "id",
                                            "paciente_id",
                                            "marco"
                                        ],
                                        "properties": {
                                            "id": {
                                                "type": "integer"
                                            },
                                            "paciente_id": {
                                                "type": "integer"
                                            },
                                            "marco": {
                                                "type": "string",
                                                "enum": [
                                                    "d1",
                                                    "s1",
                                                    "m1",
                                                    "m2",
                                                    "m6",
                                                    "m9",
                                                    "m12",
                                                    "m18"
                                                ]
                                            },
                                            "nps": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ],
                                                "minimum": 0,
                                                "maximum": 10
                                            },
                                            "concluido_em": {
                                                "type": "string",
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "marco.concluido",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "id": 5120,
                                    "paciente_id": 1204,
                                    "marco": "m12",
                                    "nps": 10,
                                    "concluido_em": "2027-10-30T16:02:11+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "execucao.areas_confirmadas": {
            "post": {
                "summary": "Áreas do dia 0 confirmadas",
                "description": "As áreas das zonas recetoras foram medidas de novo no dia da cirurgia e confirmadas, antes de começar. Só identificadores e a hora: as áreas e o desvio ficam no AnagenSys e na API.",
                "tags": [
                    "Análise e plano"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "execucao.areas_confirmadas"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "id",
                                            "cirurgia_id",
                                            "paciente_id",
                                            "plano_id"
                                        ],
                                        "properties": {
                                            "id": {
                                                "type": "integer"
                                            },
                                            "cirurgia_id": {
                                                "type": "integer"
                                            },
                                            "paciente_id": {
                                                "type": "integer"
                                            },
                                            "plano_id": {
                                                "type": "integer"
                                            },
                                            "confirmadas_em": {
                                                "type": "string",
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "execucao.areas_confirmadas",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "id": 88,
                                    "cirurgia_id": 412,
                                    "paciente_id": 1204,
                                    "plano_id": 3310,
                                    "confirmadas_em": "2026-11-03T08:12:40+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "portal.pedido_criado": {
            "post": {
                "summary": "Pedido criado no portal",
                "description": "O paciente propôs contactos/alergias ou exerceu um direito do titular (incluindo eliminar a conta). Use o id para consultar o recurso portal_pedidos.",
                "tags": [
                    "Portal do paciente"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "portal.pedido_criado"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "pedido_id",
                                            "paciente_id",
                                            "tipo"
                                        ],
                                        "properties": {
                                            "pedido_id": {
                                                "type": "integer"
                                            },
                                            "paciente_id": {
                                                "type": "integer"
                                            },
                                            "tipo": {
                                                "type": "string",
                                                "enum": [
                                                    "contactos",
                                                    "alergias",
                                                    "acesso",
                                                    "retificacao",
                                                    "portabilidade",
                                                    "apagamento",
                                                    "oposicao",
                                                    "limitacao",
                                                    "eliminar_conta"
                                                ]
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "portal.pedido_criado",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "pedido_id": 15,
                                    "paciente_id": 12,
                                    "tipo": "contactos"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "portal.consentimento_revogado": {
            "post": {
                "summary": "Autorização retirada no portal",
                "description": "O paciente retirou uma autorização opcional; o efeito é imediato. Os sistemas que usam essa finalidade (por exemplo, marketing) devem parar já.",
                "tags": [
                    "Portal do paciente"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "portal.consentimento_revogado"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "paciente_id",
                                            "finalidade",
                                            "consentimento_id"
                                        ],
                                        "properties": {
                                            "paciente_id": {
                                                "type": "integer"
                                            },
                                            "finalidade": {
                                                "type": "string"
                                            },
                                            "consentimento_id": {
                                                "type": "integer"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "portal.consentimento_revogado",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "paciente_id": 12,
                                    "finalidade": "marketing",
                                    "consentimento_id": 903
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "portal.documento_enviado": {
            "post": {
                "summary": "Documento enviado pelo paciente",
                "description": "Ficheiro clínico (cifrado) carregado no portal; obtenha-o por GET /ficheiros/{id}/url com as permissões adequadas.",
                "tags": [
                    "Portal do paciente"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "portal.documento_enviado"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "paciente_id",
                                            "ficheiro_id",
                                            "tipo"
                                        ],
                                        "properties": {
                                            "paciente_id": {
                                                "type": "integer"
                                            },
                                            "ficheiro_id": {
                                                "type": "integer"
                                            },
                                            "tipo": {
                                                "type": "string",
                                                "enum": [
                                                    "exame",
                                                    "analises",
                                                    "relatorio",
                                                    "receita",
                                                    "identificacao",
                                                    "outro"
                                                ]
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "portal.documento_enviado",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "paciente_id": 12,
                                    "ficheiro_id": 10101,
                                    "tipo": "analises"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "portal.fotos_enviadas": {
            "post": {
                "summary": "Fotografias de acompanhamento enviadas",
                "description": "Primeira fotografia do dia enviada pelo paciente (um evento por paciente e dia), associada ao marco quando indicado.",
                "tags": [
                    "Portal do paciente"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "portal.fotos_enviadas"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "paciente_id"
                                        ],
                                        "properties": {
                                            "paciente_id": {
                                                "type": "integer"
                                            },
                                            "marco_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "portal.fotos_enviadas",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "paciente_id": 12,
                                    "marco_id": 66
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "pre_avaliacao.recebida": {
            "post": {
                "summary": "Pré-avaliação online recebida",
                "description": "Uma pessoa enviou a pré-avaliação pelo site, pela app ou por um site externo autorizado. Foram criados o lead, a tarefa de revisão médica e, com a consulta escolhida, o pedido de marcação. Use o id para consultar o recurso pre_avaliacoes.",
                "tags": [
                    "Site público"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "pre_avaliacao.recebida"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "pre_avaliacao_id",
                                            "origem",
                                            "fotos"
                                        ],
                                        "properties": {
                                            "pre_avaliacao_id": {
                                                "type": "integer"
                                            },
                                            "lead_id": {
                                                "type": [
                                                    "integer",
                                                    "null"
                                                ]
                                            },
                                            "origem": {
                                                "type": "string",
                                                "enum": [
                                                    "site",
                                                    "app",
                                                    "externo"
                                                ],
                                                "description": "externo: formulário incorporado num site autorizado."
                                            },
                                            "idioma": {
                                                "type": "string",
                                                "enum": [
                                                    "pt",
                                                    "en"
                                                ]
                                            },
                                            "procedimento": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "description": "Área de interesse indicada (ex.: couro_cabeludo, barba)."
                                            },
                                            "consulta_modalidade": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "enum": [
                                                    "presencial",
                                                    "telefone",
                                                    "video",
                                                    null
                                                ],
                                                "description": "Consulta escolhida pela pessoa (gera o pedido de marcação)."
                                            },
                                            "fotos": {
                                                "type": "integer",
                                                "description": "Número de fotografias enviadas."
                                            },
                                            "criado_em": {
                                                "type": "string",
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "pre_avaliacao.recebida",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "pre_avaliacao_id": 91,
                                    "lead_id": 402,
                                    "origem": "app",
                                    "idioma": "pt",
                                    "procedimento": "couro_cabeludo",
                                    "fotos": 4,
                                    "criado_em": "2026-10-28T08:05:00+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        },
        "demonstracao.pedida": {
            "post": {
                "summary": "Pedido de demonstração do AnagenSys",
                "description": "Uma clínica pediu uma demonstração na página de apresentação ou na app. Disparado só na clínica principal.",
                "tags": [
                    "Apresentação do AnagenSys"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "evento",
                                    "id",
                                    "criado_em",
                                    "dados"
                                ],
                                "properties": {
                                    "evento": {
                                        "const": "demonstracao.pedida"
                                    },
                                    "id": {
                                        "type": "string"
                                    },
                                    "criado_em": {
                                        "type": "string",
                                        "format": "date-time"
                                    },
                                    "clinica_id": {
                                        "type": "integer"
                                    },
                                    "dados": {
                                        "type": "object",
                                        "required": [
                                            "id",
                                            "clinica_nome",
                                            "origem"
                                        ],
                                        "properties": {
                                            "id": {
                                                "type": "integer"
                                            },
                                            "clinica_nome": {
                                                "type": "string"
                                            },
                                            "pais": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "pattern": "^[A-Z]{2}$"
                                            },
                                            "especialidade": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "enum": [
                                                    "capilar",
                                                    "dermatologia",
                                                    "estetica",
                                                    "cirurgia_plastica",
                                                    "dentaria",
                                                    "oftalmologia",
                                                    "outra",
                                                    null
                                                ]
                                            },
                                            "origem": {
                                                "type": "string",
                                                "enum": [
                                                    "site",
                                                    "app"
                                                ]
                                            },
                                            "criado_em": {
                                                "type": "string",
                                                "format": "date-time"
                                            }
                                        }
                                    }
                                }
                            },
                            "example": {
                                "evento": "demonstracao.pedida",
                                "id": "evt_6f1c2a",
                                "criado_em": "2026-10-28T10:15:00+00:00",
                                "clinica_id": 1,
                                "dados": {
                                    "id": 58,
                                    "clinica_nome": "Clínica Capilar do Norte",
                                    "pais": "PT",
                                    "especialidade": "capilar",
                                    "origem": "site",
                                    "criado_em": "2026-10-27T18:40:00+00:00"
                                }
                            }
                        }
                    }
                },
                "responses": {
                    "2XX": {
                        "description": "Receção confirmada"
                    }
                }
            }
        }
    },
    "components": {
        "securitySchemes": {
            "utilizador": {
                "type": "http",
                "scheme": "bearer",
                "bearerFormat": "opaque",
                "description": "Token de acesso da equipa (POST /auth/entrar → 2FA → sigilo). Validade 20 min; renovar com POST /auth/renovar."
            },
            "paciente": {
                "type": "http",
                "scheme": "bearer",
                "bearerFormat": "opaque",
                "description": "Token do portal do paciente (POST /portal/auth/entrar)."
            },
            "integracao": {
                "type": "oauth2",
                "description": "OAuth 2.0 client credentials. Cada âmbito «modulo:nivel» corresponde a uma linha da matriz de permissões, com âmbito «todos» dentro da clínica do cliente.",
                "flows": {
                    "clientCredentials": {
                        "tokenUrl": "https://anagen.pt/api/v1/oauth/token",
                        "scopes": {
                            "admin.utilizadores:ver": "Ler: Utilizadores e acessos",
                            "admin.utilizadores:editar": "Ler e escrever: Utilizadores e acessos",
                            "admin.definicoes:ver": "Ler: Definições",
                            "admin.definicoes:editar": "Ler e escrever: Definições",
                            "admin.auditoria:ver": "Ler: Auditoria",
                            "admin.auditoria:editar": "Ler e escrever: Auditoria",
                            "clinico.parametros:ver": "Ler: Parâmetros clínicos",
                            "clinico.parametros:editar": "Ler e escrever: Parâmetros clínicos",
                            "ficha.identificacao:ver": "Ler: Identificação do paciente",
                            "ficha.identificacao:editar": "Ler e escrever: Identificação do paciente",
                            "ficha.consentimentos:ver": "Ler: Consentimentos",
                            "ficha.consentimentos:editar": "Ler e escrever: Consentimentos",
                            "ficha.clinica:ver": "Ler: Ficha clínica",
                            "ficha.clinica:editar": "Ler e escrever: Ficha clínica",
                            "ficha.captura:ver": "Ler: Captura e tricoscopia",
                            "ficha.captura:editar": "Ler e escrever: Captura e tricoscopia",
                            "ficha.fotografias:ver": "Ler: Fotografias clínicas",
                            "ficha.fotografias:editar": "Ler e escrever: Fotografias clínicas",
                            "ficha.plano:ver": "Ler: Plano cirúrgico",
                            "ficha.plano:editar": "Ler e escrever: Plano cirúrgico",
                            "crm.leads:ver": "Ler: Leads e funil",
                            "crm.leads:editar": "Ler e escrever: Leads e funil",
                            "crm.atendimento:ver": "Ler: Atendimento",
                            "crm.atendimento:editar": "Ler e escrever: Atendimento",
                            "crm.telefonia:ver": "Ler: Telefonia",
                            "crm.telefonia:editar": "Ler e escrever: Telefonia",
                            "crm.agente:ver": "Ler: Agente de conversação",
                            "crm.agente:editar": "Ler e escrever: Agente de conversação",
                            "marketing:ver": "Ler: Marketing",
                            "marketing:editar": "Ler e escrever: Marketing",
                            "agenda:ver": "Ler: Agenda",
                            "agenda:editar": "Ler e escrever: Agenda",
                            "teleconsulta:ver": "Ler: Teleconsulta",
                            "teleconsulta:editar": "Ler e escrever: Teleconsulta",
                            "bloco.mapa:ver": "Ler: Mapa de cirurgias",
                            "bloco.mapa:editar": "Ler e escrever: Mapa de cirurgias",
                            "bloco.marcar:ver": "Ler: Marcação de cirurgias",
                            "bloco.marcar:editar": "Ler e escrever: Marcação de cirurgias",
                            "bloco.registo:ver": "Ler: Registo cirúrgico",
                            "bloco.registo:editar": "Ler e escrever: Registo cirúrgico",
                            "acompanhamento:ver": "Ler: Acompanhamento",
                            "acompanhamento:editar": "Ler e escrever: Acompanhamento",
                            "comercial.propostas:ver": "Ler: Propostas",
                            "comercial.propostas:editar": "Ler e escrever: Propostas",
                            "comercial.descontos:ver": "Ler: Descontos",
                            "comercial.descontos:editar": "Ler e escrever: Descontos",
                            "financeiro.pagamentos:ver": "Ler: Pagamentos",
                            "financeiro.pagamentos:editar": "Ler e escrever: Pagamentos",
                            "financeiro.valores:ver": "Ler: Valores e comissões",
                            "financeiro.valores:editar": "Ler e escrever: Valores e comissões",
                            "stock:ver": "Ler: Stock",
                            "stock:editar": "Ler e escrever: Stock",
                            "documentos:ver": "Ler: Documentos",
                            "documentos:editar": "Ler e escrever: Documentos",
                            "conformidade:ver": "Ler: Conformidade",
                            "conformidade:editar": "Ler e escrever: Conformidade",
                            "equipa.tarefas:ver": "Ler: Tarefas",
                            "equipa.tarefas:editar": "Ler e escrever: Tarefas",
                            "equipa.chat:ver": "Ler: Conversas da equipa",
                            "equipa.chat:editar": "Ler e escrever: Conversas da equipa",
                            "indicadores.financeiros:ver": "Ler: Indicadores financeiros",
                            "indicadores.financeiros:editar": "Ler e escrever: Indicadores financeiros",
                            "indicadores.vendas:ver": "Ler: Indicadores de vendas",
                            "indicadores.vendas:editar": "Ler e escrever: Indicadores de vendas",
                            "indicadores.operacionais:ver": "Ler: Indicadores operacionais",
                            "indicadores.operacionais:editar": "Ler e escrever: Indicadores operacionais",
                            "indicadores.atendimento:ver": "Ler: Indicadores de atendimento",
                            "indicadores.atendimento:editar": "Ler e escrever: Indicadores de atendimento",
                            "site.cms:ver": "Ler: Site e conteúdos",
                            "site.cms:editar": "Ler e escrever: Site e conteúdos"
                        }
                    }
                }
            }
        },
        "headers": {
            "XRequestId": {
                "description": "Identificador do pedido (indique-o ao reportar problemas).",
                "schema": {
                    "type": "string"
                }
            },
            "XRateLimitLimit": {
                "schema": {
                    "type": "integer"
                },
                "description": "Pedidos permitidos por minuto."
            },
            "XRateLimitRemaining": {
                "schema": {
                    "type": "integer"
                },
                "description": "Pedidos restantes na janela."
            },
            "XRateLimitReset": {
                "schema": {
                    "type": "integer"
                },
                "description": "Fim da janela (epoch, segundos)."
            },
            "RetryAfter": {
                "schema": {
                    "type": "integer"
                },
                "description": "Segundos até poder repetir."
            }
        },
        "parameters": {
            "Q": {
                "name": "q",
                "in": "query",
                "required": false,
                "schema": {
                    "type": "string",
                    "maxLength": 120
                },
                "description": "Pesquisa livre."
            },
            "Ordem": {
                "name": "ordem",
                "in": "query",
                "required": false,
                "schema": {
                    "type": "string"
                },
                "example": "criado_em:desc,nome:asc",
                "description": "Ordenação: campo:asc|desc separados por vírgulas (máx. 3)."
            },
            "Pagina": {
                "name": "pagina",
                "in": "query",
                "required": false,
                "schema": {
                    "type": "integer",
                    "minimum": 1,
                    "default": 1
                }
            },
            "PorPagina": {
                "name": "por_pagina",
                "in": "query",
                "required": false,
                "schema": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 100,
                    "default": 25
                }
            },
            "IdempotencyKey": {
                "name": "Idempotency-Key",
                "in": "header",
                "required": false,
                "schema": {
                    "type": "string",
                    "minLength": 8,
                    "maxLength": 120
                },
                "description": "Torna o POST seguro de repetir durante 24 h (mesma chave + corpo diferente → 409)."
            },
            "AcceptLanguage": {
                "name": "Accept-Language",
                "in": "header",
                "required": false,
                "schema": {
                    "type": "string",
                    "enum": [
                        "pt-PT",
                        "pt-BR",
                        "en",
                        "es",
                        "fr",
                        "de"
                    ]
                }
            },
            "XAxClinica": {
                "name": "X-AX-Clinica",
                "in": "header",
                "required": false,
                "schema": {
                    "type": "string",
                    "maxLength": 120
                },
                "example": "PORTO-HAIR",
                "description": "Pedidos públicos e do paciente: código público da clínica (sem ele, a clínica é resolvida pelo domínio do pedido). Contas da equipa com acesso a várias clínicas: identificador numérico da clínica a usar neste pedido."
            }
        },
        "schemas": {
            "Meta": {
                "type": "object",
                "properties": {
                    "pagina": {
                        "type": "integer"
                    },
                    "por_pagina": {
                        "type": "integer"
                    },
                    "total": {
                        "type": "integer"
                    }
                }
            },
            "Erro": {
                "type": "object",
                "required": [
                    "codigo",
                    "mensagem"
                ],
                "properties": {
                    "codigo": {
                        "type": "string",
                        "enum": [
                            "validacao",
                            "pedido_invalido",
                            "pedido_demasiado_grande",
                            "nao_autenticado",
                            "token_expirado",
                            "token_revogado",
                            "credenciais_invalidas",
                            "codigo_invalido",
                            "desafio_invalido",
                            "dois_fatores",
                            "conta_bloqueada",
                            "ip_nao_permitido",
                            "origem_nao_permitida",
                            "sem_permissao",
                            "nao_encontrado",
                            "ligacao_invalida",
                            "metodo_nao_permitido",
                            "conflito",
                            "acao_recusada",
                            "idempotencia_conflito",
                            "idempotencia_em_curso",
                            "limite_excedido",
                            "erro_interno"
                        ]
                    },
                    "mensagem": {
                        "type": "string"
                    },
                    "campos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        }
                    }
                },
                "x-catalogo-erros": {
                    "validacao": {
                        "http": 422,
                        "descricao": "Dados inválidos; ver «campos»."
                    },
                    "pedido_invalido": {
                        "http": 400,
                        "descricao": "Pedido mal formado (ex.: JSON inválido)."
                    },
                    "pedido_demasiado_grande": {
                        "http": 413,
                        "descricao": "Corpo acima do limite."
                    },
                    "nao_autenticado": {
                        "http": 401,
                        "descricao": "Falta o token ou é inválido."
                    },
                    "token_expirado": {
                        "http": 401,
                        "descricao": "Token de acesso expirado: renove."
                    },
                    "token_revogado": {
                        "http": 401,
                        "descricao": "Token revogado (sessão terminada ou reutilização de renovação)."
                    },
                    "credenciais_invalidas": {
                        "http": 401,
                        "descricao": "Email ou palavra-passe errados."
                    },
                    "codigo_invalido": {
                        "http": 401,
                        "descricao": "Código errado ou expirado."
                    },
                    "desafio_invalido": {
                        "http": 401,
                        "descricao": "Desafio de entrada inválido ou expirado."
                    },
                    "dois_fatores": {
                        "http": 401,
                        "descricao": "Falta o segundo fator."
                    },
                    "conta_bloqueada": {
                        "http": 403,
                        "descricao": "Conta bloqueada temporariamente."
                    },
                    "ip_nao_permitido": {
                        "http": 403,
                        "descricao": "Endereço de origem não autorizado."
                    },
                    "origem_nao_permitida": {
                        "http": 403,
                        "descricao": "Origem (CORS) não autorizada."
                    },
                    "sem_permissao": {
                        "http": 403,
                        "descricao": "Sem permissão na matriz."
                    },
                    "nao_encontrado": {
                        "http": 404,
                        "descricao": "Recurso ou registo inexistente (ou fora do âmbito)."
                    },
                    "ligacao_invalida": {
                        "http": 404,
                        "descricao": "Ligação pública inexistente, expirada ou já usada."
                    },
                    "metodo_nao_permitido": {
                        "http": 405,
                        "descricao": "Método HTTP não suportado."
                    },
                    "conflito": {
                        "http": 409,
                        "descricao": "O estado atual impede a operação."
                    },
                    "acao_recusada": {
                        "http": 409,
                        "descricao": "A ação não pôde ser executada."
                    },
                    "idempotencia_conflito": {
                        "http": 409,
                        "descricao": "Idempotency-Key repetida com corpo diferente."
                    },
                    "idempotencia_em_curso": {
                        "http": 409,
                        "descricao": "Pedido com a mesma Idempotency-Key em curso."
                    },
                    "limite_excedido": {
                        "http": 429,
                        "descricao": "Demasiados pedidos; ver Retry-After."
                    },
                    "erro_interno": {
                        "http": 500,
                        "descricao": "Erro inesperado (indique o X-Request-Id)."
                    }
                }
            },
            "RespostaErro": {
                "type": "object",
                "required": [
                    "ok",
                    "erro"
                ],
                "properties": {
                    "ok": {
                        "const": false
                    },
                    "erro": {
                        "$ref": "#/components/schemas/Erro"
                    }
                }
            },
            "Opcao": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "rotulo": {
                        "type": "string"
                    },
                    "subtitulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            },
            "ResultadoAcao": {
                "type": "object",
                "properties": {
                    "mensagem": {
                        "type": "string"
                    },
                    "dados": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "redirecionar": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            },
            "EsquemaRecurso": {
                "type": "object",
                "description": "Definição do recurso para desenhar ecrãs (campos, secções, ações, permissões).",
                "properties": {
                    "chave": {
                        "type": "string"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "singular": {
                        "type": "string"
                    },
                    "modulo": {
                        "type": "string"
                    },
                    "permissoes": {
                        "type": "object"
                    },
                    "campos": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "seccoes": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "acoes": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    }
                }
            },
            "M6Erro": {
                "type": "object",
                "required": [
                    "codigo",
                    "mensagem"
                ],
                "properties": {
                    "codigo": {
                        "type": "string",
                        "enum": [
                            "validacao",
                            "nao_autenticado",
                            "sem_permissao",
                            "nao_encontrado",
                            "conflito",
                            "conflito_aviso",
                            "estado_invalido",
                            "nada_a_desfazer",
                            "consentimento_em_falta",
                            "aptidao_em_falta",
                            "relatorio_em_falta",
                            "lembrete_falhou",
                            "sem_contagens",
                            "sinais_vitais_em_falta",
                            "video_indisponivel",
                            "limite_excedido"
                        ]
                    },
                    "mensagem": {
                        "type": "string"
                    },
                    "campos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Campo → mensagem. Nos conflitos da agenda, cada campo (inicio, fim, profissional_id, participantes, sala_id, recursos) junta as mensagens dos conflitos desse campo."
                    }
                },
                "x-catalogo-erros": {
                    "conflito": {
                        "http": 409,
                        "descricao": "Conflito bloqueante na agenda (pessoa, sala, recurso, ausência, antecedência). Não se força."
                    },
                    "conflito_aviso": {
                        "http": 409,
                        "descricao": "Só avisos (feriado, fora do horário, sem horário, passado). Reenvie com \"forcar\": true."
                    },
                    "estado_invalido": {
                        "http": 409,
                        "descricao": "O estado atual não permite a operação."
                    },
                    "nada_a_desfazer": {
                        "http": 409,
                        "descricao": "Sem contagens nos últimos 10 minutos."
                    },
                    "consentimento_em_falta": {
                        "http": 422,
                        "descricao": "Falta consentimento válido (teleconsulta, gravação ou cirúrgico)."
                    },
                    "aptidao_em_falta": {
                        "http": 422,
                        "descricao": "A aptidão pré-operatória não é «apto»."
                    },
                    "relatorio_em_falta": {
                        "http": 422,
                        "descricao": "A teleconsulta só fecha com relatório."
                    },
                    "lembrete_falhou": {
                        "http": 422,
                        "descricao": "Nenhum canal entregou o lembrete."
                    },
                    "sem_contagens": {
                        "http": 422,
                        "descricao": "Fecho sem contagens de enxertos."
                    },
                    "sinais_vitais_em_falta": {
                        "http": 422,
                        "descricao": "Fecho sem sinais vitais (quando obrigatórios)."
                    },
                    "video_indisponivel": {
                        "http": 503,
                        "descricao": "O serviço de vídeo não criou a sala."
                    }
                }
            },
            "M6RespostaErro": {
                "type": "object",
                "required": [
                    "ok",
                    "erro"
                ],
                "properties": {
                    "ok": {
                        "const": false
                    },
                    "erro": {
                        "$ref": "#/components/schemas/M6Erro"
                    }
                }
            },
            "M6TipoMarcacao": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "chave": {
                        "type": "string"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "duracao_min": {
                        "type": "integer",
                        "x-unidade": "min"
                    },
                    "cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9A-F]{6}$"
                    },
                    "teleconsulta": {
                        "type": "boolean"
                    },
                    "cirurgia": {
                        "type": "boolean"
                    },
                    "sala_obrigatoria": {
                        "type": "boolean"
                    },
                    "exige_sinal": {
                        "type": "boolean",
                        "description": "Pede sinal (pagamento pendente no módulo comercial)."
                    },
                    "margem_antes_min": {
                        "type": "integer",
                        "x-unidade": "min",
                        "description": "Preparação antes (ocupa agenda)."
                    },
                    "margem_depois_min": {
                        "type": "integer",
                        "x-unidade": "min",
                        "description": "Limpeza depois (ocupa agenda)."
                    },
                    "online": {
                        "type": "boolean",
                        "description": "Pode ser marcado pelo próprio paciente (portal, site, agente)."
                    }
                }
            },
            "M6Profissional": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9A-F]{6}$"
                    },
                    "perfil": {
                        "type": "string"
                    },
                    "departamento": {
                        "type": "string"
                    }
                }
            },
            "M6Recurso": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9A-F]{6}$"
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Idioma (intérpretes)."
                    },
                    "bloco": {
                        "type": "boolean",
                        "description": "Sala de bloco operatório."
                    },
                    "capacidade": {
                        "type": "integer",
                        "description": "Marcações em simultâneo."
                    }
                }
            },
            "M6ConfiguracaoAgenda": {
                "type": "object",
                "properties": {
                    "tipos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M6TipoMarcacao"
                        }
                    },
                    "profissionais": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M6Profissional"
                        },
                        "description": "Colunas da agenda: com horário ou de departamento médico, enfermagem ou técnico."
                    },
                    "equipa": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M6Profissional"
                        },
                        "description": "Toda a equipa ativa (participantes)."
                    },
                    "salas": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M6Recurso"
                        }
                    },
                    "equipamentos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M6Recurso"
                        }
                    },
                    "interpretes": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M6Recurso"
                        }
                    },
                    "hora_inicio": {
                        "type": "integer",
                        "x-unidade": "h"
                    },
                    "hora_fim": {
                        "type": "integer",
                        "x-unidade": "h"
                    },
                    "estados": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "valor": {
                                    "type": "string"
                                },
                                "rotulo": {
                                    "type": "string"
                                },
                                "tom": {
                                    "type": "string",
                                    "enum": [
                                        "sucesso",
                                        "marca",
                                        "neutro",
                                        "perigo",
                                        "ouro",
                                        "aviso"
                                    ]
                                }
                            }
                        }
                    },
                    "pode_editar": {
                        "type": "boolean"
                    }
                }
            },
            "M6Evento": {
                "type": "object",
                "required": [
                    "id",
                    "titulo",
                    "inicio",
                    "fim",
                    "tipo"
                ],
                "description": "Evento do calendário. «tipo» marcacao traz os campos da marcação; margem traz marcacao_id; ausencia e feriado trazem diaInteiro. Nunca editáveis exceto marcações em pedido/marcada/confirmada para quem edita a agenda.",
                "properties": {
                    "id": {
                        "type": [
                            "integer",
                            "string"
                        ],
                        "description": "Inteiro nas marcações; «margem-<id>-antes|depois», «ausencia-<id>», «feriado-<id>» nos restantes."
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "marcacao",
                            "margem",
                            "ausencia",
                            "feriado"
                        ]
                    },
                    "titulo": {
                        "type": "string",
                        "description": "Nome do paciente ou lead (marcações)."
                    },
                    "subtitulo": {
                        "type": "string"
                    },
                    "inicio": {
                        "type": "string",
                        "description": "ISO 8601 com fuso; nos feriados só a data (AAAA-MM-DD)."
                    },
                    "fim": {
                        "type": "string"
                    },
                    "cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "#RRGGBB ou um token do sistema de design (var(--ax-…))."
                    },
                    "recurso": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "description": "Profissional ou sala, conforme «colunas»."
                    },
                    "url": {
                        "type": "null"
                    },
                    "editavel": {
                        "type": "boolean"
                    },
                    "diaInteiro": {
                        "type": "boolean"
                    },
                    "marcacao_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "pedido",
                            "marcada",
                            "confirmada",
                            "em_curso",
                            "concluida",
                            "faltou",
                            "cancelada",
                            "remarcada"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "tipo_id": {
                        "type": "integer"
                    },
                    "tipo_nome": {
                        "type": "string"
                    },
                    "tipo_cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9A-F]{6}$"
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "profissional_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "profissional_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "profissional_cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9A-F]{6}$"
                    },
                    "sala_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "sala_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "teleconsulta": {
                        "type": "boolean"
                    },
                    "cirurgia_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "confirmada": {
                        "type": "boolean"
                    }
                }
            },
            "M6Conflito": {
                "type": "object",
                "required": [
                    "codigo",
                    "mensagem",
                    "bloqueante",
                    "campo"
                ],
                "properties": {
                    "codigo": {
                        "type": "string",
                        "enum": [
                            "validacao",
                            "intervalo_invalido",
                            "pessoa_ocupada",
                            "sala_ocupada",
                            "recurso_ocupado",
                            "ausencia",
                            "recurso_indisponivel",
                            "antecedencia",
                            "feriado",
                            "passado",
                            "sem_horario",
                            "fora_horario"
                        ],
                        "description": "Bloqueantes: intervalo_invalido, pessoa_ocupada, sala_ocupada (acima da capacidade), recurso_ocupado, ausencia, recurso_indisponivel, antecedencia (origem portal/site/agente), validacao. Avisos: feriado, passado, fora_horario, sem_horario — feriado, passado e fora_horario passam a bloqueantes quando a origem é portal, site ou agente."
                    },
                    "mensagem": {
                        "type": "string"
                    },
                    "bloqueante": {
                        "type": "boolean"
                    },
                    "campo": {
                        "type": "string",
                        "enum": [
                            "inicio",
                            "fim",
                            "tipo_id",
                            "paciente_id",
                            "profissional_id",
                            "participantes",
                            "sala_id",
                            "recursos"
                        ]
                    },
                    "marcacao_id": {
                        "type": "integer",
                        "description": "Marcação com que colide (quando aplicável)."
                    },
                    "utilizador_id": {
                        "type": "integer"
                    },
                    "recurso_id": {
                        "type": "integer"
                    }
                }
            },
            "M6Vaga": {
                "type": "object",
                "properties": {
                    "inicio": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "fim": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "profissional_id": {
                        "type": "integer"
                    },
                    "profissional_nome": {
                        "type": "string"
                    },
                    "sala_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "description": "Sala livre atribuída (tipos com sala obrigatória ou cirurgia, ou a sala do horário)."
                    },
                    "sala_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            },
            "M6Ocupacao": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9A-F]{6}$"
                    },
                    "horas_disponiveis": {
                        "type": "number",
                        "x-unidade": "h"
                    },
                    "horas_ocupadas": {
                        "type": "number",
                        "x-unidade": "h"
                    },
                    "percentagem": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 100,
                        "x-unidade": "%"
                    },
                    "marcacoes": {
                        "type": "integer"
                    },
                    "receita": {
                        "type": "number",
                        "x-moeda": "EUR",
                        "description": "Receita estimada (só com «financeiro.valores» âmbito «todos»)."
                    }
                }
            },
            "M6Marcacao": {
                "type": "object",
                "description": "Detalhe de uma marcação (sem conteúdo clínico).",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "pedido",
                            "marcada",
                            "confirmada",
                            "em_curso",
                            "concluida",
                            "faltou",
                            "cancelada",
                            "remarcada"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "estado_tom": {
                        "type": "string",
                        "enum": [
                            "sucesso",
                            "marca",
                            "neutro",
                            "perigo",
                            "ouro",
                            "aviso"
                        ]
                    },
                    "origem": {
                        "type": "string",
                        "enum": [
                            "equipa",
                            "portal",
                            "site",
                            "agente",
                            "telefone"
                        ]
                    },
                    "origem_rotulo": {
                        "type": "string"
                    },
                    "inicio": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "fim": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "duracao_min": {
                        "type": "integer",
                        "x-unidade": "min"
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "paciente_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "lead_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "cirurgia_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "description": "Bloco cirúrgico do mapa de cirurgias."
                    },
                    "tipo_id": {
                        "type": "integer"
                    },
                    "tipo_nome": {
                        "type": "string"
                    },
                    "tipo_cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9A-F]{6}$"
                    },
                    "teleconsulta": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "estado": {
                                "type": "string",
                                "enum": [
                                    "agendada",
                                    "sala_espera",
                                    "em_curso",
                                    "terminada",
                                    "fechada"
                                ]
                            },
                            "estado_rotulo": {
                                "type": "string"
                            }
                        }
                    },
                    "profissional_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "profissional_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "profissional_cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9A-F]{6}$"
                    },
                    "sala_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "sala_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "recursos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "tipo": {
                                    "type": "string",
                                    "enum": [
                                        "equipamento",
                                        "interprete"
                                    ]
                                }
                            }
                        }
                    },
                    "participantes": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "utilizador_id": {
                                    "type": "integer"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "papel": {
                                    "type": "string"
                                },
                                "cor": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "pattern": "^#[0-9A-F]{6}$"
                                }
                            }
                        }
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Notas administrativas."
                    },
                    "confirmada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "confirmacao_canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "equipa",
                            "ligacao",
                            "telefone",
                            "portal",
                            "sms",
                            "whatsapp",
                            "email",
                            null
                        ]
                    },
                    "lembrete_enviado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "checkin_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "posto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "admissao",
                            "preparacao",
                            "extracao",
                            "implantacao",
                            "recobro",
                            "saida",
                            null
                        ]
                    },
                    "atraso_minutos": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "x-unidade": "min",
                        "description": "Atraso avisado pelo paciente."
                    },
                    "motivo_cancelamento": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "remarcada_de": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "remarcacoes": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "inicio": {
                                    "type": "string",
                                    "format": "date-time"
                                }
                            }
                        },
                        "description": "Cadeia de marcações anteriores (até 10)."
                    },
                    "politica": {
                        "type": "string",
                        "description": "Política de cancelamento do tipo."
                    },
                    "historico": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "acao": {
                                    "type": "string",
                                    "enum": [
                                        "criada",
                                        "movida",
                                        "estado",
                                        "remarcada",
                                        "lembrete",
                                        "confirmacao",
                                        "posto",
                                        "atraso",
                                        "oferta"
                                    ]
                                },
                                "descricao": {
                                    "type": "string"
                                },
                                "autor": {
                                    "type": "string"
                                },
                                "criado_em": {
                                    "type": "string",
                                    "format": "date-time"
                                }
                            }
                        }
                    },
                    "acoes": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "confirmar",
                                "chegou",
                                "concluir",
                                "faltou",
                                "remarcar",
                                "cancelar",
                                "lembrete"
                            ]
                        },
                        "description": "Ações possíveis para quem pede (vazio sem «agenda» editar)."
                    }
                }
            },
            "M6ResultadoMover": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "inicio": {
                        "type": "string",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$",
                        "description": "Hora local da clínica, sem fuso."
                    },
                    "fim": {
                        "type": "string",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$"
                    },
                    "avisos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M6Conflito"
                        }
                    }
                }
            },
            "M6ResultadoEstado": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "confirmada",
                            "em_curso",
                            "concluida",
                            "faltou",
                            "cancelada"
                        ]
                    },
                    "mensagem": {
                        "type": "string"
                    },
                    "tarefa_id": {
                        "type": "integer",
                        "description": "Tarefa de recuperação criada (faltou)."
                    },
                    "fora_da_politica": {
                        "type": "boolean",
                        "description": "Cancelamento pedido pelo paciente fora da antecedência do tipo (cancelar)."
                    },
                    "marcacao": {
                        "$ref": "#/components/schemas/M6Marcacao"
                    }
                }
            },
            "M6ListaEspera": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "nome": {
                        "type": "string"
                    },
                    "tipo_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "tipo_nome": {
                        "type": "string"
                    },
                    "profissional_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "preferencias": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Preferências de dias e horas."
                    },
                    "prioridade": {
                        "type": "string",
                        "enum": [
                            "alta",
                            "normal",
                            "baixa"
                        ]
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "ativa",
                            "contactado"
                        ]
                    },
                    "desde": {
                        "type": "string",
                        "description": "Data de entrada na lista."
                    },
                    "oferta_inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "description": "Vaga oferecida (estado «contactado»)."
                    }
                }
            },
            "M6CartaoFluxo": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "description": "Marcação."
                    },
                    "nome": {
                        "type": "string"
                    },
                    "nome_curto": {
                        "type": "string"
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "hora": {
                        "type": "string",
                        "pattern": "^\\d{2}:\\d{2}$"
                    },
                    "inicio": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "tipo_nome": {
                        "type": "string"
                    },
                    "tipo_cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9A-F]{6}$"
                    },
                    "cirurgia_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "profissional_nome": {
                        "type": "string"
                    },
                    "profissional_cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9A-F]{6}$"
                    },
                    "sala_nome": {
                        "type": "string"
                    },
                    "estado": {
                        "type": "string"
                    },
                    "confirmada": {
                        "type": "boolean"
                    },
                    "posto_desde": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "description": "Entrada no posto atual."
                    },
                    "atrasado": {
                        "type": "boolean",
                        "description": "Por chegar mais de 10 minutos depois da hora."
                    },
                    "atraso_minutos": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "x-unidade": "min"
                    }
                }
            },
            "M6Fluxo": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "string",
                        "format": "date"
                    },
                    "colunas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string",
                                    "enum": [
                                        "por_chegar",
                                        "admissao",
                                        "preparacao",
                                        "extracao",
                                        "implantacao",
                                        "recobro",
                                        "saida"
                                    ]
                                },
                                "rotulo": {
                                    "type": "string"
                                },
                                "cartoes": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/M6CartaoFluxo"
                                    }
                                }
                            }
                        }
                    },
                    "resumo": {
                        "type": "object",
                        "properties": {
                            "total": {
                                "type": "integer"
                            },
                            "por_chegar": {
                                "type": "integer"
                            },
                            "em_fluxo": {
                                "type": "integer"
                            },
                            "saida": {
                                "type": "integer"
                            },
                            "atrasados": {
                                "type": "integer"
                            },
                            "medias_min": {
                                "type": "object",
                                "additionalProperties": {
                                    "type": "integer"
                                },
                                "x-unidade": "min",
                                "description": "Posto → média de minutos no posto."
                            }
                        }
                    }
                }
            },
            "M6SalaEspera": {
                "type": "object",
                "properties": {
                    "atendidos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "nome": {
                                    "type": "string",
                                    "description": "Primeiro nome e inicial do apelido."
                                },
                                "sala": {
                                    "type": "string"
                                },
                                "hora": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "seguintes": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "nome": {
                                    "type": "string"
                                },
                                "sala": {
                                    "type": "string"
                                },
                                "hora": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "hora": {
                        "type": "string",
                        "pattern": "^\\d{2}:\\d{2}$"
                    }
                }
            },
            "M6Sincronizacao": {
                "type": "object",
                "properties": {
                    "ativa": {
                        "type": "boolean"
                    },
                    "prefixo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Primeiros 8 caracteres do token."
                    },
                    "ultimo_uso_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "M6FicheiroLigacao": {
                "type": "object",
                "properties": {
                    "ficheiro_id": {
                        "type": "integer"
                    },
                    "url": {
                        "type": "string",
                        "format": "uri",
                        "description": "Ligação assinada válida 15 minutos."
                    }
                }
            },
            "M6TeleconsultaLinha": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "marcacao_id": {
                        "type": "integer"
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "paciente_nome": {
                        "type": "string"
                    },
                    "medico_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "medico_nome": {
                        "type": "string"
                    },
                    "inicio": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "fim": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "agendada",
                            "sala_espera",
                            "em_curso",
                            "terminada",
                            "fechada"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "estado_tom": {
                        "type": "string",
                        "enum": [
                            "aviso",
                            "marca",
                            "info",
                            "sucesso",
                            "neutro"
                        ]
                    },
                    "sala_espera_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "relatorio_ok": {
                        "type": "boolean"
                    }
                }
            },
            "M6Presente": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": "string"
                    },
                    "papel": {
                        "type": "string",
                        "enum": [
                            "paciente",
                            "acompanhante",
                            "medico",
                            "interprete",
                            "outro"
                        ]
                    },
                    "relacao": {
                        "type": "string"
                    },
                    "registado_em": {
                        "type": "string",
                        "format": "date-time"
                    }
                }
            },
            "M6Teleconsulta": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "marcacao_id": {
                        "type": "integer"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "agendada",
                            "sala_espera",
                            "em_curso",
                            "terminada",
                            "fechada"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "estado_tom": {
                        "type": "string"
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "paciente_nome": {
                        "type": "string"
                    },
                    "medico_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "medico_nome": {
                        "type": "string"
                    },
                    "consentimento": {
                        "type": "boolean",
                        "description": "Consentimento de teleconsulta válido."
                    },
                    "consentimento_gravacao": {
                        "type": "boolean",
                        "description": "Consentimento de gravação válido."
                    },
                    "gravacao_permitida": {
                        "type": "boolean"
                    },
                    "sala_espera_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "admitido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "identidade_metodo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "documento",
                            "conhecido",
                            "dados_pessoais",
                            null
                        ]
                    },
                    "identidade_confirmada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "identidade_confirmada_por": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "presentes": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M6Presente"
                        }
                    },
                    "fornecedor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Chave do serviço de vídeo onde a sala foi criada."
                    },
                    "video_configurado": {
                        "type": "boolean"
                    },
                    "video_fornecedor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Chave do serviço de vídeo ativo nas Definições."
                    },
                    "sala_url": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "uri",
                        "description": "Endereço do anfitrião (só para quem conduz a sessão e enquanto não está fechada)."
                    },
                    "inicio_real": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "fim_real": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "relatorio_visivel": {
                        "type": "boolean",
                        "description": "Quem pede tem acesso à ficha clínica do paciente."
                    },
                    "relatorio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Só com acesso à ficha clínica (leitura auditada)."
                    },
                    "relatorio_origem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "equipa",
                            "assistente",
                            null
                        ]
                    },
                    "relatorio_fechado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "comprovativo_ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "relatorio_ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "capturas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "ficheiro_id": {
                                    "type": "integer"
                                },
                                "criado_em": {
                                    "type": "string",
                                    "format": "date-time"
                                }
                            }
                        }
                    },
                    "assistente": {
                        "type": "boolean",
                        "description": "O Assistente (uso «escriba») está configurado e disponível para quem pede."
                    },
                    "pode_editar": {
                        "type": "boolean"
                    },
                    "passos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string",
                                    "enum": [
                                        "consentimento",
                                        "sala_espera",
                                        "admitido",
                                        "identidade",
                                        "presentes",
                                        "relatorio",
                                        "fechada"
                                    ]
                                },
                                "feito": {
                                    "type": "boolean"
                                }
                            }
                        }
                    }
                }
            },
            "M6PropostaRelatorio": {
                "type": "object",
                "properties": {
                    "ok": {
                        "type": "boolean"
                    },
                    "texto": {
                        "type": "string",
                        "description": "Proposta para o médico rever (não gravada)."
                    },
                    "fornecedor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Serviço de IA que respondeu (reenviar em ia_fornecedor)."
                    },
                    "modelo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Modelo usado (reenviar em ia_modelo)."
                    },
                    "pedido_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "description": "Pedido do Assistente (reenviar em ia_pedido_id)."
                    },
                    "erro": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            },
            "M6Indicador": {
                "type": "object",
                "properties": {
                    "chave": {
                        "type": "string",
                        "enum": [
                            "confirmada",
                            "sinal",
                            "consentimento",
                            "analises",
                            "checklist"
                        ]
                    },
                    "rotulo": {
                        "type": "string"
                    },
                    "ok": {
                        "type": "boolean"
                    }
                }
            },
            "M6MembroEquipa": {
                "type": "object",
                "properties": {
                    "utilizador_id": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9A-F]{6}$"
                    },
                    "papel": {
                        "type": "string",
                        "enum": [
                            "cirurgiao",
                            "assistente",
                            "enfermeiro",
                            "tecnico",
                            "anestesista"
                        ]
                    },
                    "papel_rotulo": {
                        "type": "string"
                    },
                    "honorarios_valor": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-moeda": "EUR",
                        "description": "Honorários da pessoa nesta cirurgia. No detalhe do mapa só sai com «financeiro.valores» (âmbito «todos»: de todos; senão só os próprios)."
                    }
                }
            },
            "M6Cirurgia": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "numero": {
                        "type": "string",
                        "description": "Número da cirurgia (usado na confirmação do fecho)."
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "pre_marcada",
                            "reservada",
                            "validada",
                            "confirmada",
                            "em_curso",
                            "concluida",
                            "cancelada"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "estado_tom": {
                        "type": "string",
                        "enum": [
                            "neutro",
                            "ouro",
                            "info",
                            "sucesso",
                            "marca",
                            "perigo"
                        ]
                    },
                    "paciente_id": {
                        "type": "integer"
                    },
                    "paciente_nome": {
                        "type": "string"
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "proposta_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "plano_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "marcacao_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "description": "Bloco correspondente na agenda."
                    },
                    "sala_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "sala_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "inicio_previsto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "fim_previsto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "FUE",
                            "FUT",
                            "DHI",
                            "outra",
                            null
                        ]
                    },
                    "enxertos_planeados": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "x-unidade": "enxertos"
                    },
                    "aptidao": {
                        "type": "string",
                        "enum": [
                            "por_avaliar",
                            "apto",
                            "nao_apto"
                        ]
                    },
                    "aptidao_rotulo": {
                        "type": "string"
                    },
                    "validada_por": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Nome de quem validou."
                    },
                    "validada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "confirmada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "indicadores": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M6Indicador"
                        }
                    },
                    "equipa": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M6MembroEquipa"
                        }
                    },
                    "valor_ato": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-moeda": "EUR",
                        "description": "Só com «financeiro.valores» (âmbito «todos», ou nas cirurgias em que participa ou que reservou)."
                    },
                    "valores_visiveis": {
                        "type": "boolean"
                    },
                    "enxertos_extraidos": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "x-unidade": "enxertos"
                    },
                    "enxertos_implantados": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "x-unidade": "enxertos"
                    },
                    "cabelos_total": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "x-unidade": "cabelos"
                    },
                    "fechada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "motivo_cancelamento": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "acoes": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "reservar",
                                "equipa",
                                "aptidao",
                                "validar",
                                "confirmar",
                                "analises",
                                "cancelar",
                                "painel",
                                "checklist"
                            ]
                        },
                        "description": "Ações possíveis para quem pede."
                    },
                    "checklists": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M6Checklist"
                        },
                        "description": "Checklists pré-operatórias (no detalhe e após reservar ou criar checklists)."
                    }
                }
            },
            "M6EventoMapa": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "subtitulo": {
                        "type": "string",
                        "description": "Estado · indicadores feitos/5 · equipa."
                    },
                    "inicio": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "fim": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Cor do cirurgião (pré-marcadas: token neutro)."
                    },
                    "recurso": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "description": "Sala."
                    },
                    "url": {
                        "type": "null"
                    },
                    "editavel": {
                        "type": "boolean"
                    },
                    "numero": {
                        "type": "string"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "pre_marcada",
                            "reservada",
                            "validada",
                            "confirmada",
                            "em_curso",
                            "concluida"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "estado_tom": {
                        "type": "string"
                    },
                    "paciente_id": {
                        "type": "integer"
                    },
                    "paciente_nome": {
                        "type": "string"
                    },
                    "sala_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "enxertos_planeados": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "x-unidade": "enxertos"
                    },
                    "indicadores": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M6Indicador"
                        }
                    },
                    "indicadores_ok": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 5
                    },
                    "equipa": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "utilizador_id": {
                                    "type": "integer"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "cor": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "pattern": "^#[0-9A-F]{6}$"
                                },
                                "papel": {
                                    "type": "string"
                                }
                            }
                        }
                    }
                }
            },
            "M6CirurgiaPorAgendar": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "numero": {
                        "type": "string"
                    },
                    "paciente_id": {
                        "type": "integer"
                    },
                    "paciente_nome": {
                        "type": "string"
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "enxertos_planeados": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "x-unidade": "enxertos"
                    },
                    "sinal_pago": {
                        "type": "boolean"
                    },
                    "desde": {
                        "type": "string",
                        "format": "date-time"
                    }
                }
            },
            "M6Escala": {
                "type": "object",
                "properties": {
                    "dias": {
                        "type": "array",
                        "minItems": 7,
                        "maxItems": 7,
                        "items": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    "linhas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "utilizador": {
                                    "$ref": "#/components/schemas/M6Profissional"
                                },
                                "dias": {
                                    "type": "array",
                                    "items": {
                                        "type": "object",
                                        "properties": {
                                            "data": {
                                                "type": "string",
                                                "format": "date"
                                            },
                                            "itens": {
                                                "type": "array",
                                                "items": {
                                                    "type": "object",
                                                    "properties": {
                                                        "cirurgia_id": {
                                                            "type": "integer"
                                                        },
                                                        "numero": {
                                                            "type": "string"
                                                        },
                                                        "hora": {
                                                            "type": "string",
                                                            "description": "Início–fim (HH:MM–HH:MM)."
                                                        },
                                                        "sala": {
                                                            "type": "string"
                                                        },
                                                        "papel": {
                                                            "type": "string",
                                                            "description": "Papel (rótulo)."
                                                        },
                                                        "estado": {
                                                            "type": "string"
                                                        }
                                                    }
                                                }
                                            },
                                            "ausencia": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ],
                                                "description": "Tipo de ausência aprovada nesse dia."
                                            }
                                        }
                                    }
                                },
                                "total": {
                                    "type": "integer",
                                    "description": "Cirurgias da pessoa na semana."
                                }
                            }
                        }
                    }
                }
            },
            "M6OcupacaoBloco": {
                "type": "object",
                "properties": {
                    "sala_id": {
                        "type": "integer"
                    },
                    "sala_nome": {
                        "type": "string"
                    },
                    "cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9A-F]{6}$"
                    },
                    "horas_disponiveis": {
                        "type": "number",
                        "x-unidade": "h"
                    },
                    "horas_usadas": {
                        "type": "number",
                        "x-unidade": "h"
                    },
                    "percentagem": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 100,
                        "x-unidade": "%"
                    },
                    "cirurgias": {
                        "type": "integer"
                    }
                }
            },
            "M6ResultadoReserva": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "description": "Cirurgia."
                    },
                    "inicio": {
                        "type": "string",
                        "description": "Hora local da clínica, sem fuso."
                    },
                    "fim": {
                        "type": "string"
                    },
                    "recurso": {
                        "type": "integer",
                        "description": "Sala."
                    },
                    "avisos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M6Conflito"
                        }
                    },
                    "mensagem": {
                        "type": "string"
                    },
                    "cirurgia": {
                        "$ref": "#/components/schemas/M6Cirurgia"
                    }
                }
            },
            "M6ChecklistItem": {
                "type": "object",
                "properties": {
                    "texto": {
                        "type": "string"
                    },
                    "responsavel_papel": {
                        "type": "string",
                        "description": "Papel responsável (cirurgiao, enfermeiro, …)."
                    },
                    "obrigatorio": {
                        "type": "boolean"
                    },
                    "feito": {
                        "type": "boolean"
                    },
                    "feito_por": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "feito_por_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "feito_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "M6Checklist": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "fase": {
                        "type": "string",
                        "enum": [
                            "pre_operatorio",
                            "admissao",
                            "desenho",
                            "anestesia",
                            "extracao",
                            "implantacao",
                            "penso",
                            "alta"
                        ]
                    },
                    "fase_rotulo": {
                        "type": "string"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "aberta",
                            "concluida"
                        ]
                    },
                    "itens": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M6ChecklistItem"
                        }
                    },
                    "feitos": {
                        "type": "integer"
                    },
                    "total": {
                        "type": "integer"
                    },
                    "concluida_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "M6EnxertosPorTipo": {
                "type": "object",
                "description": "Enxertos por tipo de UF: \"1\", \"2\", \"3\" e \"4\" (4 = 4 ou mais cabelos; para o total de cabelos conta como Definições › Bloco › cabelos da UF 4, mínimo 4).",
                "x-unidade": "enxertos",
                "properties": {
                    "1": {
                        "type": "integer"
                    },
                    "2": {
                        "type": "integer"
                    },
                    "3": {
                        "type": "integer"
                    },
                    "4": {
                        "type": "integer"
                    }
                }
            },
            "M6ContagemMomento": {
                "type": "object",
                "properties": {
                    "por_tipo": {
                        "$ref": "#/components/schemas/M6EnxertosPorTipo"
                    },
                    "total": {
                        "type": "integer",
                        "x-unidade": "enxertos"
                    },
                    "cabelos": {
                        "type": "integer",
                        "x-unidade": "cabelos"
                    },
                    "cabelos_por_enxerto": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "cabelos/enxerto"
                    }
                }
            },
            "M6ContagemOperador": {
                "type": "object",
                "properties": {
                    "operador_id": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9A-F]{6}$"
                    },
                    "extracao": {
                        "type": "integer",
                        "x-unidade": "enxertos"
                    },
                    "implantacao": {
                        "type": "integer",
                        "x-unidade": "enxertos"
                    },
                    "por_tipo": {
                        "$ref": "#/components/schemas/M6EnxertosPorTipo"
                    },
                    "por_hora": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "x-unidade": "enxertos/h",
                        "description": "Ritmo entre a primeira e a última contagem (mínimo 15 min)."
                    }
                }
            },
            "M6Contagens": {
                "type": "object",
                "properties": {
                    "extracao": {
                        "$ref": "#/components/schemas/M6ContagemMomento"
                    },
                    "implantacao": {
                        "$ref": "#/components/schemas/M6ContagemMomento"
                    },
                    "por_operador": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M6ContagemOperador"
                        }
                    }
                }
            },
            "M6UltimaContagem": {
                "type": [
                    "object",
                    "null"
                ],
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "tipo_uf": {
                        "type": "integer",
                        "enum": [
                            1,
                            2,
                            3,
                            4
                        ]
                    },
                    "momento": {
                        "type": "string",
                        "enum": [
                            "extracao",
                            "implantacao"
                        ]
                    },
                    "operador": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time"
                    }
                }
            },
            "M6Progresso": {
                "type": "object",
                "properties": {
                    "extraido_pct": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "minimum": 0,
                        "maximum": 100,
                        "x-unidade": "%"
                    },
                    "implantado_pct": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "minimum": 0,
                        "maximum": 100,
                        "x-unidade": "%"
                    }
                }
            },
            "M6ResumoContagem": {
                "type": "object",
                "properties": {
                    "contagens": {
                        "$ref": "#/components/schemas/M6Contagens"
                    },
                    "planeado": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "x-unidade": "enxertos"
                    },
                    "progresso": {
                        "$ref": "#/components/schemas/M6Progresso"
                    },
                    "ultima_contagem": {
                        "$ref": "#/components/schemas/M6UltimaContagem"
                    }
                }
            },
            "M6Fase": {
                "type": "object",
                "properties": {
                    "fase": {
                        "type": "string",
                        "enum": [
                            "admissao",
                            "desenho",
                            "anestesia",
                            "extracao",
                            "implantacao",
                            "penso",
                            "alta"
                        ]
                    },
                    "rotulo": {
                        "type": "string"
                    },
                    "duracao_seg": {
                        "type": "integer",
                        "x-unidade": "s",
                        "description": "Duração sem pausas."
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "atual": {
                        "type": "boolean"
                    },
                    "feita": {
                        "type": "boolean"
                    }
                }
            },
            "M6Lote": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "lote": {
                        "type": "string"
                    },
                    "quantidade": {
                        "type": "integer",
                        "x-unidade": "enxertos"
                    },
                    "operador": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "extraido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "implantado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "horas_fora": {
                        "type": "number",
                        "x-unidade": "h",
                        "description": "Tempo fora do corpo (até à implantação ou até agora)."
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "ok",
                            "aviso",
                            "perigo"
                        ]
                    }
                }
            },
            "M6Transeccao": {
                "type": "object",
                "properties": {
                    "sessao_pct": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "%"
                    },
                    "amostras": {
                        "type": "integer"
                    },
                    "observados": {
                        "type": "integer",
                        "x-unidade": "enxertos"
                    },
                    "por_operador": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "operador_id": {
                                    "type": "integer"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "pct": {
                                    "type": [
                                        "number",
                                        "null"
                                    ],
                                    "x-unidade": "%"
                                },
                                "observados": {
                                    "type": "integer",
                                    "x-unidade": "enxertos"
                                }
                            }
                        }
                    }
                }
            },
            "M6PlanoBloco": {
                "type": [
                    "object",
                    "null"
                ],
                "description": "Resumo do plano aprovado do episódio (com «ficha.plano» resumo).",
                "properties": {
                    "id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "versao": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "enxertos_necessarios": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "x-unidade": "enxertos"
                    },
                    "capacidade_sessao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "x-unidade": "enxertos"
                    },
                    "zonas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "zona": {
                                    "type": "string"
                                },
                                "rotulo": {
                                    "type": "string"
                                },
                                "area_cm2": {
                                    "type": [
                                        "number",
                                        "null"
                                    ],
                                    "x-unidade": "cm²"
                                },
                                "densidade_alvo": {
                                    "type": [
                                        "number",
                                        "null"
                                    ],
                                    "x-unidade": "UF/cm²"
                                },
                                "enxertos": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ],
                                    "x-unidade": "enxertos"
                                }
                            }
                        }
                    }
                }
            },
            "M6EnfSinaisVitais": {
                "type": "object",
                "description": "Pelo menos um valor.",
                "properties": {
                    "tas": {
                        "type": "number",
                        "minimum": 40,
                        "maximum": 260,
                        "x-unidade": "mmHg",
                        "description": "Tensão arterial sistólica."
                    },
                    "tad": {
                        "type": "number",
                        "minimum": 20,
                        "maximum": 160,
                        "x-unidade": "mmHg",
                        "description": "Tensão arterial diastólica."
                    },
                    "fc": {
                        "type": "number",
                        "minimum": 20,
                        "maximum": 250,
                        "x-unidade": "bpm"
                    },
                    "spo2": {
                        "type": "number",
                        "minimum": 50,
                        "maximum": 100,
                        "x-unidade": "%"
                    },
                    "temperatura": {
                        "type": "number",
                        "minimum": 30,
                        "maximum": 43,
                        "x-unidade": "°C"
                    },
                    "fr": {
                        "type": "number",
                        "minimum": 4,
                        "maximum": 60,
                        "x-unidade": "cpm",
                        "description": "Frequência respiratória."
                    }
                }
            },
            "M6EnfFarmaco": {
                "type": "object",
                "required": [
                    "nome",
                    "dose"
                ],
                "properties": {
                    "nome": {
                        "type": "string",
                        "maxLength": 120
                    },
                    "dose": {
                        "type": "number",
                        "minimum": 0.001,
                        "maximum": 100000
                    },
                    "unidade": {
                        "type": "string",
                        "enum": [
                            "mg",
                            "ml",
                            "mcg",
                            "UI",
                            "g"
                        ],
                        "default": "mg"
                    },
                    "concentracao_pct": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "minimum": 0.01,
                        "maximum": 100,
                        "x-unidade": "%",
                        "description": "Obrigatória para lidocaína em ml (1 % = 10 mg/ml)."
                    },
                    "via": {
                        "type": "string",
                        "enum": [
                            "local",
                            "subcutanea",
                            "endovenosa",
                            "oral",
                            "intramuscular",
                            "topica",
                            "inalatoria"
                        ],
                        "default": "local"
                    },
                    "hora": {
                        "type": "string",
                        "pattern": "^\\d{2}:\\d{2}$",
                        "description": "Por omissão a hora atual."
                    },
                    "lote": {
                        "type": "string",
                        "maxLength": 40
                    },
                    "adrenalina": {
                        "type": "boolean",
                        "description": "Com adrenalina (limite de lidocaína de 7 mg/kg quando todas a levaram)."
                    },
                    "artigo_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "description": "Artigo de stock (consumo registado no fecho)."
                    }
                }
            },
            "M6EnfDor": {
                "type": "object",
                "required": [
                    "escala"
                ],
                "properties": {
                    "escala": {
                        "type": "number",
                        "minimum": 0,
                        "maximum": 10
                    },
                    "local": {
                        "type": "string",
                        "maxLength": 120
                    }
                }
            },
            "M6EnfIncidente": {
                "type": "object",
                "required": [
                    "descricao"
                ],
                "properties": {
                    "descricao": {
                        "type": "string",
                        "maxLength": 2000
                    },
                    "gravidade": {
                        "type": "string",
                        "enum": [
                            "baixa",
                            "media",
                            "alta"
                        ],
                        "default": "baixa"
                    },
                    "medidas": {
                        "type": "string",
                        "maxLength": 2000
                    }
                }
            },
            "M6EnfNota": {
                "type": "object",
                "required": [
                    "texto"
                ],
                "properties": {
                    "texto": {
                        "type": "string",
                        "maxLength": 4000
                    },
                    "zona": {
                        "type": "string",
                        "maxLength": 40,
                        "description": "Zona do couro cabeludo trabalhada."
                    }
                }
            },
            "M6RegistoEnfermagem": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "sinais_vitais",
                            "farmaco",
                            "dor",
                            "incidente",
                            "nota"
                        ]
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "dados": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/M6EnfSinaisVitais"
                            },
                            {
                                "$ref": "#/components/schemas/M6EnfFarmaco"
                            },
                            {
                                "$ref": "#/components/schemas/M6EnfDor"
                            },
                            {
                                "$ref": "#/components/schemas/M6EnfIncidente"
                            },
                            {
                                "$ref": "#/components/schemas/M6EnfNota"
                            }
                        ]
                    },
                    "texto": {
                        "type": "string",
                        "description": "Resumo legível para listas e cronologia."
                    },
                    "autor": {
                        "type": "string"
                    },
                    "registado_em": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "anulado": {
                        "type": "boolean"
                    },
                    "motivo_anulacao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            },
            "M6Lidocaina": {
                "type": "object",
                "properties": {
                    "mg_total": {
                        "type": "number",
                        "x-unidade": "mg",
                        "description": "Dose acumulada (registos não anulados)."
                    },
                    "mg_kg": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "mg/kg"
                    },
                    "limite": {
                        "type": "number",
                        "x-unidade": "mg/kg",
                        "description": "4,5 (ou 7 com adrenalina em todas as administrações), configurável."
                    },
                    "com_adrenalina": {
                        "type": "boolean"
                    },
                    "aviso_pct": {
                        "type": "number",
                        "x-unidade": "%",
                        "description": "Percentagem do limite a partir da qual há aviso."
                    },
                    "percentagem": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 100,
                        "x-unidade": "%"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "ok",
                            "aviso",
                            "perigo",
                            "sem_peso"
                        ]
                    },
                    "peso_kg": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "kg"
                    }
                }
            },
            "M6Enfermagem": {
                "type": "object",
                "required": [
                    "visivel"
                ],
                "description": "Com {visivel:false} quem pede não tem acesso à ficha clínica do paciente e não recebe mais nada. Leitura clínica auditada (no máximo uma vez por pessoa e cirurgia a cada 10 minutos).",
                "properties": {
                    "visivel": {
                        "type": "boolean"
                    },
                    "registos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M6RegistoEnfermagem"
                        }
                    },
                    "lidocaina": {
                        "$ref": "#/components/schemas/M6Lidocaina"
                    },
                    "sinais_vitais": {
                        "type": "object",
                        "properties": {
                            "ultimo_em": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            },
                            "intervalo_min": {
                                "type": "integer",
                                "x-unidade": "min",
                                "description": "Intervalo pedido entre registos (Definições › Bloco)."
                            },
                            "em_atraso": {
                                "type": "boolean"
                            }
                        }
                    },
                    "dor_ultima": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "minimum": 0,
                        "maximum": 10
                    },
                    "vias": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "valor": {
                                    "type": "string"
                                },
                                "rotulo": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "unidades": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    }
                }
            },
            "M6Alta": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "instrucoes": {
                        "type": "string"
                    },
                    "medicacao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Só com acesso à ficha clínica."
                    },
                    "medicacao_visivel": {
                        "type": "boolean"
                    },
                    "contacto_urgencia": {
                        "type": "string"
                    },
                    "primeira_lavagem": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "marcacao_id": {
                                "type": "integer"
                            },
                            "inicio": {
                                "type": "string",
                                "format": "date-time"
                            },
                            "estado": {
                                "type": "string"
                            }
                        }
                    },
                    "enxertos_por_tipo": {
                        "$ref": "#/components/schemas/M6EnxertosPorTipo"
                    },
                    "total_cabelos": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "x-unidade": "cabelos"
                    },
                    "folha_entregue_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "certificado_garantia": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "documento_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "registada_por": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "registada_em": {
                        "type": "string",
                        "format": "date-time"
                    }
                }
            },
            "M6Painel": {
                "type": "object",
                "properties": {
                    "cirurgia": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "numero": {
                                "type": "string"
                            },
                            "estado": {
                                "type": "string",
                                "enum": [
                                    "pre_marcada",
                                    "reservada",
                                    "validada",
                                    "confirmada",
                                    "em_curso",
                                    "concluida",
                                    "cancelada"
                                ]
                            },
                            "estado_rotulo": {
                                "type": "string"
                            },
                            "estado_tom": {
                                "type": "string"
                            },
                            "paciente_id": {
                                "type": "integer"
                            },
                            "paciente_nome": {
                                "type": "string"
                            },
                            "sala_nome": {
                                "type": "string"
                            },
                            "tecnica": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "inicio_previsto": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            },
                            "inicio_real": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            },
                            "fim_real": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            },
                            "fase_atual": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "enum": [
                                    "admissao",
                                    "desenho",
                                    "anestesia",
                                    "extracao",
                                    "implantacao",
                                    "penso",
                                    "alta",
                                    null
                                ]
                            },
                            "pausada": {
                                "type": "boolean"
                            },
                            "pausada_em": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            },
                            "decorrido_seg": {
                                "type": "integer",
                                "x-unidade": "s",
                                "description": "Tempo de sessão sem pausas."
                            },
                            "peso_kg": {
                                "type": [
                                    "number",
                                    "null"
                                ],
                                "x-unidade": "kg"
                            },
                            "consentimento": {
                                "type": "boolean",
                                "description": "Consentimento cirúrgico válido."
                            }
                        }
                    },
                    "fases": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M6Fase"
                        }
                    },
                    "equipa": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M6MembroEquipa"
                        }
                    },
                    "operadores": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M6MembroEquipa"
                        },
                        "description": "Equipa que pode contar (cirurgião, assistente, técnico, enfermeiro)."
                    },
                    "contagens": {
                        "$ref": "#/components/schemas/M6Contagens"
                    },
                    "planeado": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "x-unidade": "enxertos"
                    },
                    "progresso": {
                        "$ref": "#/components/schemas/M6Progresso"
                    },
                    "ultima_contagem": {
                        "$ref": "#/components/schemas/M6UltimaContagem"
                    },
                    "lotes": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M6Lote"
                        }
                    },
                    "tempo_fora": {
                        "type": "object",
                        "properties": {
                            "alerta_h": {
                                "type": "number",
                                "x-unidade": "h"
                            },
                            "maximo_h": {
                                "type": "number",
                                "x-unidade": "h"
                            }
                        }
                    },
                    "transeccao": {
                        "$ref": "#/components/schemas/M6Transeccao"
                    },
                    "plano": {
                        "$ref": "#/components/schemas/M6PlanoBloco"
                    },
                    "enfermagem": {
                        "$ref": "#/components/schemas/M6Enfermagem"
                    },
                    "checklists": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M6Checklist"
                        }
                    },
                    "alta": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/M6Alta"
                            },
                            {
                                "type": "null"
                            }
                        ]
                    },
                    "permissoes": {
                        "type": "object",
                        "properties": {
                            "registar": {
                                "type": "boolean",
                                "description": "Pode registar (confirmada ou em curso)."
                            },
                            "abrir": {
                                "type": "boolean"
                            },
                            "fechar": {
                                "type": "boolean"
                            },
                            "enfermagem": {
                                "type": "boolean",
                                "description": "Pode registar enfermagem (acesso à ficha clínica e sessão aberta)."
                            }
                        }
                    },
                    "voz_palavras": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "array",
                            "items": {
                                "type": "string"
                            }
                        },
                        "description": "Palavras reconhecidas na contagem por voz (\"1\"–\"4\" e \"desfazer\"), em pt, en, es, fr e de."
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time"
                    }
                }
            },
            "M6CirurgiaDoDia": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "numero": {
                        "type": "string"
                    },
                    "paciente_nome": {
                        "type": "string"
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "sala_nome": {
                        "type": "string"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "validada",
                            "confirmada",
                            "em_curso",
                            "concluida"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "estado_tom": {
                        "type": "string"
                    },
                    "fase_atual": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "enxertos_planeados": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "x-unidade": "enxertos"
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "equipa": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M6MembroEquipa"
                        }
                    }
                }
            },
            "M6EfeitosFecho": {
                "type": "object",
                "description": "Resultado de cada serviço chamado no fecho: ok, erro (registado no servidor; o fecho mantém-se) ou indisponivel (módulo não instalado).",
                "properties": {
                    "marcos": {
                        "type": "string",
                        "enum": [
                            "ok",
                            "erro",
                            "indisponivel"
                        ]
                    },
                    "honorarios": {
                        "type": "string",
                        "enum": [
                            "ok",
                            "erro",
                            "indisponivel"
                        ]
                    },
                    "stock": {
                        "type": "string",
                        "enum": [
                            "ok",
                            "erro",
                            "indisponivel"
                        ]
                    },
                    "episodio": {
                        "type": "string",
                        "enum": [
                            "ok",
                            "erro",
                            "indisponivel"
                        ],
                        "description": "Só quando a cirurgia tem episódio."
                    },
                    "webhook": {
                        "type": "string",
                        "enum": [
                            "ok",
                            "erro",
                            "indisponivel"
                        ]
                    }
                }
            },
            "M1Erro": {
                "type": "object",
                "required": [
                    "codigo",
                    "mensagem"
                ],
                "properties": {
                    "codigo": {
                        "type": "string",
                        "enum": [
                            "validacao",
                            "pedido_invalido",
                            "pedido_demasiado_grande",
                            "nao_encontrado",
                            "ligacao_invalida",
                            "limite_excedido",
                            "erro_interno"
                        ]
                    },
                    "mensagem": {
                        "type": "string"
                    },
                    "campos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        }
                    }
                },
                "x-catalogo-erros": {
                    "ligacao_invalida": {
                        "http": 404,
                        "descricao": "Token com formato errado, inexistente, expirado ou de um pedido já respondido."
                    }
                }
            },
            "M1RespostaErro": {
                "type": "object",
                "required": [
                    "ok",
                    "erro"
                ],
                "properties": {
                    "ok": {
                        "const": false
                    },
                    "erro": {
                        "$ref": "#/components/schemas/M1Erro"
                    }
                }
            },
            "M1Ligacao": {
                "type": "object",
                "description": "Ligação de bloco: caminho web (relativo ao endereço da clínica) e rota da app.",
                "properties": {
                    "web": {
                        "type": "string"
                    },
                    "app": {
                        "type": "string"
                    }
                }
            },
            "M1Bloco": {
                "type": "object",
                "required": [
                    "tipo"
                ],
                "additionalProperties": true,
                "description": "Bloco no formato único da ficha e do painel: kpis {itens:[{rotulo, valor, unidade?, delta?, tom?, ligacao?}]}, lista {itens:[{titulo, subtitulo?, estado?, data?, icone?, ligacao?}], vazio}, campos {itens:[{rotulo, valor, unidade?, tom?}]}, grafico {grafico, valores:[{x, y, serie?}], unidade?}, galeria {itens:[{ficheiro_id, legenda?, data?}]}, cronologia {itens:[{titulo, descricao?, data, categoria}]}, alerta {tom, texto}, jornada {etapa, episodio_id}, acoes {itens:[{rotulo, icone, ligacao, tom?}]}.",
                "properties": {
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "kpis",
                            "lista",
                            "campos",
                            "grafico",
                            "galeria",
                            "cronologia",
                            "alerta",
                            "jornada",
                            "acoes"
                        ]
                    },
                    "itens": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "tom": {
                        "type": "string",
                        "enum": [
                            "marca",
                            "ouro",
                            "sucesso",
                            "aviso",
                            "perigo",
                            "info",
                            "neutro"
                        ]
                    }
                }
            },
            "M1PacienteMinimo": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "numero": {
                        "type": "string"
                    },
                    "nome_completo": {
                        "type": "string"
                    },
                    "idade": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "sexo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "F",
                            "M",
                            "X",
                            null
                        ]
                    }
                }
            },
            "M1Alerta": {
                "type": "object",
                "x-anagen-permissao": "ficha.clinica",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "alergia",
                            "medicacao",
                            "condicao",
                            "anticoagulante",
                            "outro"
                        ]
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "gravidade": {
                        "type": "string",
                        "enum": [
                            "baixa",
                            "media",
                            "alta"
                        ]
                    },
                    "gravidade_rotulo": {
                        "type": "string"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Decifrada."
                    },
                    "validado": {
                        "type": "boolean"
                    }
                }
            },
            "M1Episodio": {
                "type": "object",
                "description": "Episódio sem conteúdo clínico, com a equipa ativa.",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "numero": {
                        "type": "string"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "area": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "area_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "avaliacao",
                            "plano",
                            "proposta",
                            "agendado",
                            "pre_operatorio",
                            "cirurgia",
                            "pos_operatorio",
                            "acompanhamento",
                            "concluido",
                            "cancelado"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "etapa_jornada": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 9
                    },
                    "medico_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "medico_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "aberto_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "fechado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "equipa": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "utilizador_id": {
                                    "type": "integer"
                                },
                                "papel": {
                                    "type": "string"
                                },
                                "papel_rotulo": {
                                    "type": "string"
                                },
                                "nome": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                }
                            }
                        }
                    }
                }
            },
            "M1PacienteCabecalho": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "numero": {
                        "type": "string"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "nome_completo": {
                        "type": "string"
                    },
                    "iniciais": {
                        "type": "string"
                    },
                    "sexo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "F",
                            "M",
                            "X",
                            null
                        ]
                    },
                    "sexo_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "data_nascimento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "x-anagen-permissao": "ficha.identificacao:ver"
                    },
                    "idade": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "email": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "x-anagen-permissao": "ficha.identificacao:ver"
                    },
                    "telefone": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "x-anagen-permissao": "ficha.identificacao:ver"
                    },
                    "localidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "x-anagen-permissao": "ficha.identificacao:ver"
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "ativo",
                            "arquivado",
                            "anonimizado"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "portal_ativo": {
                        "type": "boolean"
                    },
                    "litigio": {
                        "type": "boolean"
                    },
                    "medico": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "nome": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    },
                    "responsavel": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "nome": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    },
                    "foto_ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "x-anagen-permissao": "ficha.fotografias"
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "M1Ficha": {
                "type": "object",
                "properties": {
                    "paciente": {
                        "$ref": "#/components/schemas/M1PacienteCabecalho"
                    },
                    "alertas": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M1Alerta"
                        },
                        "description": "Ativos, dos mais graves e por validar para os restantes; vazio sem acesso clínico."
                    },
                    "alertas_visiveis": {
                        "type": "boolean"
                    },
                    "episodios": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M1Episodio"
                        }
                    },
                    "episodio_ativo": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/M1Episodio"
                            },
                            {
                                "type": "null"
                            }
                        ]
                    },
                    "jornada": {
                        "type": "object",
                        "properties": {
                            "etapa": {
                                "type": "integer",
                                "minimum": 1,
                                "maximum": 9
                            },
                            "episodio_id": {
                                "type": [
                                    "integer",
                                    "null"
                                ]
                            },
                            "seccoes": {
                                "type": "object",
                                "additionalProperties": {
                                    "type": "string"
                                },
                                "description": "Etapa (1–9) → chave da secção a abrir."
                            },
                            "etapas": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "numero": {
                                            "type": "integer"
                                        },
                                        "rotulo": {
                                            "type": "string"
                                        },
                                        "descricao": {
                                            "type": [
                                                "string",
                                                "null"
                                            ]
                                        },
                                        "seccao": {
                                            "type": [
                                                "string",
                                                "null"
                                            ]
                                        }
                                    }
                                },
                                "description": "Acréscimo compatível: as 9 etapas na língua do pedido (Contacto, Pré-avaliação, Consulta, Captura e plano, Orçamento, Pré-operatório, Cirurgia, Pós-operatório, Acompanhamento — a fonte é o servidor) e a secção que cada uma abre."
                            }
                        }
                    },
                    "seccoes": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string"
                                },
                                "titulo": {
                                    "type": "string"
                                },
                                "icone": {
                                    "type": "string"
                                },
                                "ordem": {
                                    "type": "integer"
                                },
                                "clinica": {
                                    "type": "boolean"
                                },
                                "contador": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "modulo": {
                                    "type": "string"
                                },
                                "restrita": {
                                    "type": "boolean",
                                    "description": "Acréscimo compatível: o paciente restringiu esta secção no portal; só abre com acesso de emergência («quebrar o vidro»)."
                                }
                            }
                        }
                    },
                    "acoes": {
                        "type": "object",
                        "properties": {
                            "editar": {
                                "type": "boolean"
                            },
                            "nova_consulta": {
                                "type": "boolean"
                            },
                            "resumo_ia": {
                                "type": "boolean"
                            },
                            "resumo_ia_configurado": {
                                "type": "boolean"
                            },
                            "duplicados": {
                                "type": "boolean"
                            },
                            "novo_episodio": {
                                "type": "boolean"
                            },
                            "pedir_formulario": {
                                "type": "boolean"
                            },
                            "emergencia": {
                                "type": "boolean"
                            },
                            "prescrever_url": {
                                "type": "string",
                                "description": "Endereço do software de prescrição certificado (só médicos; vazio quando não configurado)."
                            }
                        }
                    }
                }
            },
            "M1SeccaoFicha": {
                "type": "object",
                "properties": {
                    "chave": {
                        "type": "string"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "icone": {
                        "type": "string"
                    },
                    "clinica": {
                        "type": "boolean"
                    },
                    "blocos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M1Bloco"
                        }
                    }
                }
            },
            "M1Duplicado": {
                "type": "object",
                "description": "Só identificação mínima, com email e telefone mascarados.",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "numero": {
                        "type": "string"
                    },
                    "nome_completo": {
                        "type": "string"
                    },
                    "data_nascimento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "email": {
                        "type": "string"
                    },
                    "telefone": {
                        "type": "string"
                    },
                    "estado": {
                        "type": "string"
                    },
                    "pontuacao": {
                        "type": "integer",
                        "minimum": 40,
                        "maximum": 100
                    },
                    "forte": {
                        "type": "boolean",
                        "description": "Pontuação ≥ 80."
                    },
                    "razoes": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "nif",
                                "email",
                                "telefone",
                                "nome_data",
                                "apelido_data"
                            ]
                        }
                    },
                    "razoes_rotulo": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    }
                }
            },
            "M1ComparacaoFusao": {
                "type": "object",
                "properties": {
                    "manter": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "numero": {
                                "type": "string"
                            },
                            "nome_completo": {
                                "type": "string"
                            }
                        }
                    },
                    "remover": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "numero": {
                                "type": "string"
                            },
                            "nome_completo": {
                                "type": "string"
                            }
                        }
                    },
                    "campos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "campo": {
                                    "type": "string"
                                },
                                "rotulo": {
                                    "type": "string"
                                },
                                "manter": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "remover": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "igual": {
                                    "type": "boolean"
                                }
                            }
                        }
                    }
                }
            },
            "M1ResultadoFusao": {
                "type": "object",
                "properties": {
                    "manter_id": {
                        "type": "integer"
                    },
                    "remover_id": {
                        "type": "integer"
                    },
                    "campos": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "reafetados": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "integer"
                        },
                        "description": "Tabela → linhas reafetadas."
                    },
                    "ignoradas": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "description": "Tabelas imutáveis que recusaram a alteração."
                    }
                }
            },
            "M1AlertasMedicacao": {
                "type": "object",
                "properties": {
                    "farmaco": {
                        "type": "string"
                    },
                    "alertas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "nivel": {
                                    "type": "string",
                                    "enum": [
                                        "alerta",
                                        "bloqueio"
                                    ]
                                },
                                "mensagem": {
                                    "type": "string"
                                },
                                "origem": {
                                    "type": "string",
                                    "enum": [
                                        "alergia",
                                        "regra"
                                    ]
                                }
                            }
                        }
                    },
                    "seguro": {
                        "type": "boolean",
                        "description": "false quando há algum bloqueio."
                    }
                }
            },
            "M1Importacao": {
                "type": "object",
                "properties": {
                    "colunas": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Cabeçalho do ficheiro → campo do paciente (só os reconhecidos)."
                    },
                    "linhas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "linha": {
                                    "type": "integer",
                                    "description": "Número da linha no ficheiro (a primeira de dados é a 2)."
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "estado": {
                                    "type": "string",
                                    "enum": [
                                        "novo",
                                        "duplicado",
                                        "importado",
                                        "erro"
                                    ]
                                },
                                "mensagens": {
                                    "type": "array",
                                    "items": {
                                        "type": "string"
                                    }
                                },
                                "duplicado_de": {
                                    "type": [
                                        "object",
                                        "null"
                                    ],
                                    "properties": {
                                        "id": {
                                            "type": "integer"
                                        },
                                        "numero": {
                                            "type": "string"
                                        },
                                        "nome": {
                                            "type": "string"
                                        }
                                    }
                                },
                                "id": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ],
                                    "description": "Registo criado (só ao importar): paciente, consulta, alerta ou episódio."
                                },
                                "paciente": {
                                    "type": [
                                        "object",
                                        "null"
                                    ],
                                    "properties": {
                                        "id": {
                                            "type": "integer"
                                        },
                                        "numero": {
                                            "type": "string"
                                        }
                                    },
                                    "description": "Histórico: o paciente encontrado (sem nome)."
                                }
                            }
                        }
                    },
                    "resumo": {
                        "type": "object",
                        "properties": {
                            "total": {
                                "type": "integer"
                            },
                            "novos": {
                                "type": "integer"
                            },
                            "duplicados": {
                                "type": "integer"
                            },
                            "erros": {
                                "type": "integer"
                            },
                            "importados": {
                                "type": "integer"
                            }
                        }
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "pacientes",
                            "consultas",
                            "alertas",
                            "episodios"
                        ]
                    },
                    "importacao_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "description": "Linha do recurso «importacoes» (só ao importar)."
                    }
                }
            },
            "M1PropostaIa": {
                "type": "object",
                "description": "Proposta do assistente de IA da clínica: valor proposto e excerto de origem (decifrados), fatores explicativos, serviço e modelo usados, parâmetros do pedido, confiança e decisão humana (quem, quando, valor final, motivo).",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "consulta_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "resposta_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "escriba",
                            "pre_analise",
                            "resumo",
                            "rascunho_resposta",
                            "triagem"
                        ]
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "campo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "campo_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "valor_proposto": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "excerto_origem": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "fatores": {
                        "type": "object",
                        "description": "Ex.: excerto_verificado, confianca_modelo; na pré-análise justificacao, observacoes e fotografias; no resumo as fontes."
                    },
                    "fornecedor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Serviço que respondeu (o local da clínica ou o externo de recurso)."
                    },
                    "fornecedor_rotulo": {
                        "type": "string"
                    },
                    "modelo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Modelo usado, registado para rastreio."
                    },
                    "parametros": {
                        "type": "object",
                        "description": "uso, temperatura, versao_pedido, caracteres ou fotografias…"
                    },
                    "confianca": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "minimum": 0,
                        "maximum": 1
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "pendente",
                            "aceite",
                            "corrigida",
                            "recusada"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "valor_final": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "decidido_por": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Nome de quem decidiu."
                    },
                    "decidido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "lote": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Agrupa as propostas do mesmo pedido."
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                },
                "example": {
                    "id": 9120,
                    "paciente_id": 1204,
                    "episodio_id": 77,
                    "consulta_id": 4410,
                    "resposta_id": null,
                    "tipo": "escriba",
                    "tipo_rotulo": "Escriba",
                    "campo": "alergias",
                    "campo_rotulo": "Alergias",
                    "valor_proposto": "Alergia a penicilina (exantema).",
                    "excerto_origem": "sou alérgico à penicilina, fiquei cheio de manchas",
                    "fatores": {
                        "excerto_verificado": true,
                        "confianca_modelo": 0.92
                    },
                    "confianca": 0.92,
                    "estado": "pendente",
                    "estado_rotulo": "Pendente",
                    "valor_final": null,
                    "decidido_por": null,
                    "decidido_em": null,
                    "motivo": null,
                    "lote": "3f2a9c0d6b1e4a7f8c2d5e9b0a1f3c4d",
                    "criado_em": "2026-10-28T10:22:00+00:00"
                }
            },
            "M1Mapa": {
                "type": "object",
                "description": "Mapa do couro cabeludo: zonas assinaladas, pontos com nota e a linha desenhada (coordenadas 0–1).",
                "properties": {
                    "zonas": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "linha_frontal",
                                "tufo_central",
                                "tempora_esq",
                                "tempora_dir",
                                "frontal",
                                "media",
                                "coroa",
                                "parietal_esq",
                                "parietal_dir",
                                "occipital"
                            ]
                        }
                    },
                    "pontos": {
                        "type": "array",
                        "maxItems": 60,
                        "items": {
                            "type": "object",
                            "required": [
                                "x",
                                "y"
                            ],
                            "properties": {
                                "x": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 1
                                },
                                "y": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 1
                                },
                                "nota": {
                                    "type": "string",
                                    "maxLength": 120
                                }
                            }
                        }
                    },
                    "linha": {
                        "type": "array",
                        "maxItems": 200,
                        "items": {
                            "type": "object",
                            "required": [
                                "x",
                                "y"
                            ],
                            "properties": {
                                "x": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 1
                                },
                                "y": {
                                    "type": "number",
                                    "minimum": 0,
                                    "maximum": 1
                                }
                            }
                        }
                    }
                },
                "example": {
                    "zonas": [
                        "linha_frontal",
                        "frontal",
                        "coroa"
                    ],
                    "pontos": [
                        {
                            "x": 0.5,
                            "y": 0.71,
                            "nota": "Miniaturização visível"
                        }
                    ],
                    "linha": [
                        {
                            "x": 0.3,
                            "y": 0.14
                        },
                        {
                            "x": 0.5,
                            "y": 0.11
                        },
                        {
                            "x": 0.7,
                            "y": 0.14
                        }
                    ]
                }
            },
            "M1Aditamento": {
                "type": "object",
                "properties": {
                    "texto": {
                        "type": "string"
                    },
                    "autor_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "autor_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "M1Consulta": {
                "type": "object",
                "description": "Consulta decifrada (textos clínicos cifrados em repouso).",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "paciente_id": {
                        "type": "integer"
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "marcacao_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "medico_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "medico_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "primeira",
                            "avaliacao",
                            "controlo",
                            "teleconsulta",
                            "pre_operatoria"
                        ]
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "rascunho",
                            "assinada"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "escala": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "grau": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "basp": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "precise_pontuacao": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "minimum": 0,
                        "maximum": 100,
                        "x-unidade": "%"
                    },
                    "miniaturizacao_dadora_pct": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "minimum": 0,
                        "maximum": 100,
                        "x-unidade": "%"
                    },
                    "area": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "sessoes_previstas": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "minimum": 1,
                        "maximum": 6,
                        "x-unidade": "sessões"
                    },
                    "zonas": {
                        "$ref": "#/components/schemas/M1Mapa"
                    },
                    "escalas": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Escala → grau."
                    },
                    "elegibilidade": {
                        "type": "string",
                        "enum": [
                            "por_avaliar",
                            "apto",
                            "apto_condicional",
                            "nao_apto"
                        ]
                    },
                    "elegibilidade_rotulo": {
                        "type": "string"
                    },
                    "alertas": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        },
                        "description": "Alertas da última avaliação de elegibilidade gravada."
                    },
                    "viabilidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "viavel",
                            "condicional",
                            "nao_viavel",
                            null
                        ]
                    },
                    "viabilidade_validada_por": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "viabilidade_validada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "assinada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "assinada_por": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "impressao_digital": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^[a-f0-9]{64}$"
                    },
                    "diagnostico_diferencial_itens": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "codigo": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "sistema": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "na_lista": {
                                    "type": "boolean"
                                }
                            }
                        },
                        "description": "Acréscimo compatível: diagnósticos escolhidos da lista de apoio aprovada (no PUT envia-se a lista de chaves, só do médico; fora da lista → 422)."
                    },
                    "origem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "«importacao» nas consultas vindas de outro sistema (entram fechadas)."
                    },
                    "aditamentos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M1Aditamento"
                        }
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "atualizado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "antecedentes": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "medicacao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "alergias": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "habitos": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "historia_familiar": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "expectativas": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "exame": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "diagnostico": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "diagnostico_diferencial": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                },
                "example": {
                    "id": 4410,
                    "paciente_id": 1204,
                    "episodio_id": 77,
                    "marcacao_id": 2051,
                    "medico_id": 7,
                    "medico_nome": "Inês Valente",
                    "tipo": "primeira",
                    "tipo_rotulo": "Primeira consulta",
                    "data": "2026-10-28T10:00:00+00:00",
                    "estado": "rascunho",
                    "estado_rotulo": "Rascunho",
                    "escala": "norwood",
                    "grau": "IV",
                    "basp": null,
                    "precise_pontuacao": 62.5,
                    "miniaturizacao_dadora_pct": 12,
                    "area": "couro_cabeludo",
                    "tecnica": "FUE",
                    "sessoes_previstas": 1,
                    "zonas": {
                        "zonas": [
                            "linha_frontal",
                            "frontal",
                            "coroa"
                        ],
                        "pontos": [
                            {
                                "x": 0.5,
                                "y": 0.71,
                                "nota": "Miniaturização visível"
                            }
                        ],
                        "linha": [
                            {
                                "x": 0.3,
                                "y": 0.14
                            },
                            {
                                "x": 0.5,
                                "y": 0.11
                            },
                            {
                                "x": 0.7,
                                "y": 0.14
                            }
                        ]
                    },
                    "escalas": {
                        "norwood": "IV"
                    },
                    "elegibilidade": "apto_condicional",
                    "elegibilidade_rotulo": "Apto com condições",
                    "alertas": [
                        {
                            "regra_id": 12,
                            "nome": "Anticoagulante",
                            "nivel": "alerta",
                            "mensagem": "Confirmar a suspensão com o médico assistente.",
                            "origem": "regra"
                        }
                    ],
                    "viabilidade": null,
                    "viabilidade_validada_por": null,
                    "viabilidade_validada_em": null,
                    "assinada_em": null,
                    "assinada_por": null,
                    "impressao_digital": null,
                    "aditamentos": [],
                    "criado_em": "2026-10-28T09:58:00+00:00",
                    "atualizado_em": "2026-10-28T10:21:00+00:00",
                    "motivo": "Queda progressiva na zona frontal desde há 5 anos.",
                    "antecedentes": "Sem antecedentes relevantes.",
                    "medicacao": "Apixabano 5 mg.",
                    "alergias": "Penicilina.",
                    "habitos": "Não fumador.",
                    "historia_familiar": "Pai com alopecia androgenética.",
                    "expectativas": "Recuperar a linha frontal.",
                    "exame": "Rarefação frontal e na coroa; zona dadora com boa densidade.",
                    "diagnostico": "Alopecia androgenética, Norwood IV.",
                    "diagnostico_diferencial": null,
                    "notas": null
                }
            },
            "M1ConsultaEntrada": {
                "type": "object",
                "description": "Campos aceites por PUT /consultas/{id} (os restantes são ignorados). Campos só do médico: diagnostico, diagnostico_diferencial, diagnostico_diferencial_itens (lista de chaves da lista de apoio aprovada), escala, grau, basp, precise_pontuacao, escalas, zonas, area, tecnica, sessoes_previstas.",
                "properties": {
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 20000
                    },
                    "antecedentes": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 20000
                    },
                    "medicacao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 20000
                    },
                    "alergias": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 20000
                    },
                    "habitos": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 20000
                    },
                    "historia_familiar": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 20000
                    },
                    "expectativas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 20000
                    },
                    "exame": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 20000
                    },
                    "diagnostico": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 20000
                    },
                    "diagnostico_diferencial": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 20000
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 20000
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "primeira",
                            "avaliacao",
                            "controlo",
                            "teleconsulta",
                            "pre_operatoria"
                        ]
                    },
                    "data": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "escala": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "norwood",
                            "ludwig",
                            "savin",
                            "sinclair",
                            "basp",
                            "outra",
                            null
                        ]
                    },
                    "grau": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "maxLength": 20,
                        "description": "Tem de existir na escala (ver GET /clinica/catalogo), exceto com a escala «outra»."
                    },
                    "basp": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^(L|M[0-3]|C[0-3]|U[1-3])(F[1-3])?(V[1-3])?$"
                    },
                    "precise_pontuacao": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "minimum": 0,
                        "maximum": 100,
                        "x-unidade": "%"
                    },
                    "miniaturizacao_dadora_pct": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "minimum": 0,
                        "maximum": 100,
                        "x-unidade": "%"
                    },
                    "area": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "couro_cabeludo",
                            "barba",
                            "sobrancelhas",
                            "feminina",
                            "reparacao",
                            "outra",
                            null
                        ]
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "FUE",
                            "FUT",
                            "DHI",
                            "outra",
                            null
                        ]
                    },
                    "sessoes_previstas": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "minimum": 1,
                        "maximum": 6
                    },
                    "zonas": {
                        "$ref": "#/components/schemas/M1Mapa"
                    },
                    "escalas": {
                        "type": "object",
                        "properties": {
                            "norwood": {
                                "type": "string"
                            },
                            "ludwig": {
                                "type": "string"
                            },
                            "savin": {
                                "type": "string"
                            },
                            "sinclair": {
                                "type": "string"
                            }
                        },
                        "description": "Escala → grau; pares com escala ou grau inválidos são descartados."
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    }
                }
            },
            "M1Elegibilidade": {
                "type": "object",
                "properties": {
                    "estado": {
                        "type": "string",
                        "enum": [
                            "por_avaliar",
                            "apto",
                            "apto_condicional",
                            "nao_apto"
                        ]
                    },
                    "alertas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "regra_id": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "nivel": {
                                    "type": "string",
                                    "enum": [
                                        "alerta",
                                        "bloqueio"
                                    ]
                                },
                                "mensagem": {
                                    "type": "string"
                                },
                                "origem": {
                                    "type": "string",
                                    "enum": [
                                        "regra",
                                        "motor",
                                        "sistema"
                                    ]
                                }
                            }
                        }
                    },
                    "regras_aprovadas": {
                        "type": "integer"
                    },
                    "motor": {
                        "type": "boolean",
                        "description": "Há limites de uma versão aprovada do motor."
                    }
                },
                "example": {
                    "estado": "apto_condicional",
                    "alertas": [
                        {
                            "regra_id": 12,
                            "nome": "Anticoagulante",
                            "nivel": "alerta",
                            "mensagem": "Confirmar a suspensão com o médico assistente.",
                            "origem": "regra"
                        }
                    ],
                    "regras_aprovadas": 9,
                    "motor": true
                }
            },
            "M1PacoteConsulta": {
                "type": "object",
                "properties": {
                    "consulta": {
                        "$ref": "#/components/schemas/M1Consulta"
                    },
                    "paciente": {
                        "$ref": "#/components/schemas/M1PacienteMinimo"
                    },
                    "episodio": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/M1Episodio"
                            },
                            {
                                "type": "null"
                            }
                        ]
                    },
                    "alertas": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M1Alerta"
                        }
                    },
                    "elegibilidade": {
                        "$ref": "#/components/schemas/M1Elegibilidade"
                    },
                    "tabela_clinica": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "zona": {
                                    "type": "string"
                                },
                                "min": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ],
                                    "x-unidade": "enxertos"
                                },
                                "max": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ],
                                    "x-unidade": "enxertos"
                                }
                            }
                        },
                        "description": "Intervalo de enxertos da tabela clínica aprovada para as zonas e o grau da consulta."
                    },
                    "propostas": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M1PropostaIa"
                        },
                        "description": "Propostas pendentes desta consulta."
                    },
                    "anteriores": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "data": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "format": "date-time"
                                },
                                "tipo": {
                                    "type": "string"
                                },
                                "tipo_rotulo": {
                                    "type": "string"
                                },
                                "estado": {
                                    "type": "string"
                                },
                                "estado_rotulo": {
                                    "type": "string"
                                },
                                "medico_nome": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "escala": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "grau": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "elegibilidade": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "questionario": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "nome": {
                                "type": "string"
                            },
                            "estado": {
                                "type": "string"
                            },
                            "estado_rotulo": {
                                "type": "string"
                            },
                            "preenchido_em": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            },
                            "itens": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "rotulo": {
                                            "type": "string"
                                        },
                                        "texto": {
                                            "type": "string"
                                        },
                                        "alarme": {
                                            "type": "boolean"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "permissoes": {
                        "type": "object",
                        "properties": {
                            "editar": {
                                "type": "boolean"
                            },
                            "editar_medico": {
                                "type": "boolean"
                            },
                            "assinar": {
                                "type": "boolean"
                            },
                            "aditar": {
                                "type": "boolean"
                            },
                            "viabilidade": {
                                "type": "boolean"
                            },
                            "escriba": {
                                "type": "boolean"
                            },
                            "pre_analise": {
                                "type": "boolean"
                            },
                            "resumo": {
                                "type": "boolean"
                            }
                        }
                    },
                    "ia": {
                        "type": "object",
                        "properties": {
                            "escriba": {
                                "type": "boolean"
                            },
                            "pre_analise": {
                                "type": "boolean"
                            },
                            "resumo": {
                                "type": "boolean"
                            },
                            "consentimento": {
                                "type": "boolean"
                            }
                        },
                        "description": "Usos do assistente configurados e consentimento «ia» do paciente — para o ecrã mostrar quando não está disponível."
                    },
                    "prescricao": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "url": {
                                "type": "string",
                                "format": "uri"
                            },
                            "nome": {
                                "type": "string"
                            }
                        }
                    }
                }
            },
            "M1CatalogoConsulta": {
                "type": "object",
                "properties": {
                    "diagnosticos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "codigo": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "sistema": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "descricao": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                }
                            }
                        },
                        "description": "Acréscimo compatível: lista de apoio ao diagnóstico diferencial aprovada pela direção clínica (recurso diagnosticos_apoio)."
                    },
                    "caixa": {
                        "type": "object",
                        "properties": {
                            "largura": {
                                "const": 100
                            },
                            "altura": {
                                "const": 120
                            }
                        }
                    },
                    "zonas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string",
                                    "enum": [
                                        "linha_frontal",
                                        "tufo_central",
                                        "tempora_esq",
                                        "tempora_dir",
                                        "frontal",
                                        "media",
                                        "coroa",
                                        "parietal_esq",
                                        "parietal_dir",
                                        "occipital"
                                    ]
                                },
                                "rotulo": {
                                    "type": "string"
                                },
                                "grupo": {
                                    "type": "string",
                                    "enum": [
                                        "recetora",
                                        "dadora"
                                    ]
                                },
                                "pontos": {
                                    "type": "array",
                                    "items": {
                                        "type": "array",
                                        "items": {
                                            "type": "number"
                                        },
                                        "minItems": 2,
                                        "maxItems": 2
                                    }
                                }
                            }
                        }
                    },
                    "escalas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string"
                                },
                                "rotulo": {
                                    "type": "string"
                                },
                                "sexo": {
                                    "type": "array",
                                    "items": {
                                        "type": "string"
                                    }
                                },
                                "graus": {
                                    "type": "array",
                                    "items": {
                                        "type": "object",
                                        "properties": {
                                            "valor": {
                                                "type": "string"
                                            },
                                            "rotulo": {
                                                "type": "string"
                                            },
                                            "descricao": {
                                                "type": "string"
                                            },
                                            "perda": {
                                                "type": "object",
                                                "additionalProperties": {
                                                    "type": "number",
                                                    "minimum": 0,
                                                    "maximum": 1
                                                },
                                                "description": "Zona → perda (0–1)."
                                            }
                                        }
                                    }
                                },
                                "basicos": {
                                    "type": "array",
                                    "items": {
                                        "type": "object"
                                    }
                                },
                                "especificos": {
                                    "type": "array",
                                    "items": {
                                        "type": "object"
                                    }
                                }
                            }
                        }
                    },
                    "tipos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M1Opcao"
                        }
                    },
                    "areas": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M1Opcao"
                        }
                    },
                    "tecnicas": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M1Opcao"
                        }
                    },
                    "viabilidades": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M1Opcao"
                        }
                    },
                    "elegibilidades": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M1Opcao"
                        }
                    },
                    "papeis": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M1Opcao"
                        }
                    },
                    "campos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "campo": {
                                    "type": "string"
                                },
                                "rotulo": {
                                    "type": "string"
                                },
                                "ajuda": {
                                    "type": "string"
                                },
                                "medico": {
                                    "type": "boolean",
                                    "description": "Só o médico preenche."
                                }
                            }
                        }
                    },
                    "seccoes": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string",
                                    "enum": [
                                        "anamnese",
                                        "exame",
                                        "mapa",
                                        "diagnostico"
                                    ]
                                },
                                "rotulo": {
                                    "type": "string"
                                },
                                "campos": {
                                    "type": "array",
                                    "items": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                }
            },
            "M1Opcao": {
                "type": "object",
                "properties": {
                    "valor": {
                        "type": "string"
                    },
                    "rotulo": {
                        "type": "string"
                    }
                }
            },
            "M1Completude": {
                "type": "object",
                "properties": {
                    "itens": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string",
                                    "enum": [
                                        "consulta_assinada",
                                        "notas",
                                        "viabilidade",
                                        "questionario",
                                        "alertas",
                                        "fotografias",
                                        "plano",
                                        "consentimento",
                                        "proposta",
                                        "sinal"
                                    ]
                                },
                                "rotulo": {
                                    "type": "string"
                                },
                                "estado": {
                                    "type": "string",
                                    "enum": [
                                        "ok",
                                        "falta",
                                        "indisponivel"
                                    ]
                                },
                                "estado_rotulo": {
                                    "type": "string"
                                },
                                "detalhe": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "ligacao": {
                                    "$ref": "#/components/schemas/M1Ligacao"
                                }
                            }
                        }
                    },
                    "pronto": {
                        "type": "boolean"
                    },
                    "em_falta": {
                        "type": "integer"
                    }
                }
            },
            "M1ContadoresValidacao": {
                "type": "object",
                "properties": {
                    "proposta": {
                        "type": "integer"
                    },
                    "resposta": {
                        "type": "integer"
                    },
                    "pre_avaliacao": {
                        "type": "integer"
                    },
                    "alerta": {
                        "type": "integer"
                    },
                    "consulta": {
                        "type": "integer"
                    },
                    "total": {
                        "type": "integer"
                    }
                }
            },
            "M1ItemValidacao": {
                "type": "object",
                "properties": {
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "proposta",
                            "resposta",
                            "pre_avaliacao",
                            "alerta",
                            "consulta"
                        ]
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "id": {
                        "type": "integer"
                    },
                    "chave": {
                        "type": "string",
                        "description": "«tipo:id»."
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "paciente_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "paciente_numero": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "subtitulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "urgente": {
                        "type": "boolean"
                    },
                    "extra": {
                        "type": "object",
                        "description": "proposta: tipo_proposta, consulta_id; resposta/pré-avaliação: fotos, devolvida; alerta: gravidade; consulta: elegibilidade."
                    }
                }
            },
            "M1DetalheValidacao": {
                "type": "object",
                "description": "Conforme o tipo, traz «proposta», «resposta» (com lead_id), «alerta» ou «consulta» (com «permissoes»).",
                "properties": {
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "proposta",
                            "resposta",
                            "pre_avaliacao",
                            "alerta",
                            "consulta"
                        ]
                    },
                    "id": {
                        "type": "integer"
                    },
                    "paciente": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/M1PacienteMinimo"
                            },
                            {
                                "type": "null"
                            }
                        ]
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "proposta": {
                        "allOf": [
                            {
                                "$ref": "#/components/schemas/M1PropostaIa"
                            },
                            {
                                "type": "object",
                                "properties": {
                                    "pode_decidir": {
                                        "type": "boolean"
                                    }
                                }
                            }
                        ]
                    },
                    "resposta": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "formulario_id": {
                                "type": "integer"
                            },
                            "formulario_nome": {
                                "type": "string"
                            },
                            "formulario_tipo": {
                                "type": "string"
                            },
                            "versao": {
                                "type": "integer"
                            },
                            "origem": {
                                "type": "string",
                                "enum": [
                                    "paciente",
                                    "equipa",
                                    "agente",
                                    "site"
                                ]
                            },
                            "origem_rotulo": {
                                "type": "string"
                            },
                            "estado": {
                                "type": "string",
                                "enum": [
                                    "pendente",
                                    "por_validar",
                                    "validado",
                                    "rejeitado",
                                    "expirado"
                                ]
                            },
                            "pontuacao": {
                                "type": [
                                    "number",
                                    "null"
                                ]
                            },
                            "faixa": {
                                "type": [
                                    "object",
                                    "null"
                                ],
                                "properties": {
                                    "rotulo": {
                                        "type": "string"
                                    },
                                    "tom": {
                                        "type": "string"
                                    }
                                }
                            },
                            "alarme": {
                                "type": "boolean"
                            },
                            "preenchido_em": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            },
                            "devolvido_em": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            },
                            "devolucao_motivo": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "itens": {
                                "type": "array",
                                "items": {
                                    "$ref": "#/components/schemas/M1ItemResposta"
                                }
                            },
                            "fotos": {
                                "type": "array",
                                "items": {
                                    "type": "integer"
                                },
                                "description": "Identificadores de ficheiros (resposta e pré-avaliação do site)."
                            },
                            "triagem": {
                                "type": "array",
                                "items": {
                                    "$ref": "#/components/schemas/M1PropostaIa"
                                }
                            }
                        }
                    },
                    "alerta": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "tipo": {
                                "type": "string",
                                "enum": [
                                    "alergia",
                                    "medicacao",
                                    "condicao",
                                    "anticoagulante",
                                    "outro"
                                ]
                            },
                            "tipo_rotulo": {
                                "type": "string"
                            },
                            "gravidade": {
                                "type": "string",
                                "enum": [
                                    "baixa",
                                    "media",
                                    "alta"
                                ]
                            },
                            "gravidade_rotulo": {
                                "type": "string"
                            },
                            "descricao": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "origem": {
                                "type": "string",
                                "enum": [
                                    "equipa",
                                    "paciente",
                                    "agente",
                                    "formulario",
                                    "importacao"
                                ]
                            },
                            "origem_rotulo": {
                                "type": "string"
                            },
                            "criado_em": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            }
                        }
                    },
                    "consulta": {
                        "$ref": "#/components/schemas/M1Consulta"
                    },
                    "permissoes": {
                        "type": "object"
                    },
                    "pode_decidir": {
                        "type": "boolean"
                    }
                }
            },
            "M1DesempenhoIa": {
                "type": "object",
                "properties": {
                    "de": {
                        "type": "string",
                        "format": "date"
                    },
                    "ate": {
                        "type": "string",
                        "format": "date"
                    },
                    "totais": {
                        "type": "object",
                        "properties": {
                            "pendente": {
                                "type": "integer"
                            },
                            "aceite": {
                                "type": "integer"
                            },
                            "corrigida": {
                                "type": "integer"
                            },
                            "recusada": {
                                "type": "integer"
                            },
                            "decididas": {
                                "type": "integer"
                            },
                            "concordancia": {
                                "type": [
                                    "number",
                                    "null"
                                ],
                                "minimum": 0,
                                "maximum": 100,
                                "x-unidade": "%"
                            }
                        }
                    },
                    "por_tipo": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M1AgregadoDesempenho"
                        }
                    },
                    "por_modelo": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M1AgregadoDesempenho"
                        }
                    },
                    "serie": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "x": {
                                    "type": "string",
                                    "description": "Semana ISO «AAAA-SS»."
                                },
                                "y": {
                                    "type": [
                                        "number",
                                        "null"
                                    ],
                                    "minimum": 0,
                                    "maximum": 100,
                                    "x-unidade": "%"
                                },
                                "serie": {
                                    "type": "string"
                                }
                            }
                        },
                        "description": "Concordância por semana (só semanas com decisões)."
                    }
                }
            },
            "M1AgregadoDesempenho": {
                "type": "object",
                "properties": {
                    "chave": {
                        "type": "string"
                    },
                    "rotulo": {
                        "type": "string"
                    },
                    "pendente": {
                        "type": "integer"
                    },
                    "aceite": {
                        "type": "integer"
                    },
                    "corrigida": {
                        "type": "integer"
                    },
                    "recusada": {
                        "type": "integer"
                    },
                    "decididas": {
                        "type": "integer"
                    },
                    "total": {
                        "type": "integer"
                    },
                    "concordancia": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "minimum": 0,
                        "maximum": 100,
                        "x-unidade": "%"
                    }
                }
            },
            "M1Formulario": {
                "type": "object",
                "description": "Resumo do formulário (sem o esquema).",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "chave": {
                        "type": "string"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "anamnese",
                            "questionario_previo",
                            "seguimento",
                            "satisfacao",
                            "pre_avaliacao",
                            "tecnica",
                            "triagem_sintomas",
                            "outro"
                        ]
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "versao": {
                        "type": "integer"
                    },
                    "idioma": {
                        "type": "string",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ]
                    },
                    "ativo": {
                        "type": "boolean"
                    },
                    "modelo": {
                        "type": "boolean"
                    },
                    "expira_dias": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "publicado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                },
                "example": {
                    "id": 31,
                    "chave": "questionario_previo_fue",
                    "nome": "Questionário prévio — FUE",
                    "descricao": "A preencher antes da primeira consulta.",
                    "tipo": "questionario_previo",
                    "tipo_rotulo": "Questionário prévio",
                    "tecnica": "FUE",
                    "versao": 3,
                    "idioma": "pt-PT",
                    "ativo": true,
                    "modelo": false,
                    "expira_dias": 14,
                    "publicado_em": "2026-10-20T15:40:00+01:00"
                }
            },
            "M1Pergunta": {
                "type": "object",
                "required": [
                    "chave",
                    "tipo",
                    "rotulo"
                ],
                "description": "Pergunta do esquema. Propriedades por tipo: escolha/multipla → opcoes (1–60); escala → min, max (amplitude até 100), passo, rotulo_min, rotulo_max, pontuar, alarme_min; numero → unidade, casas (0–3), min, max, pontuar, alarme_min, alarme_max; simnao → pontos_sim, alarme_sim; grelha → linhas (até 30) e colunas (até 12); fotografia → vistas (até 12), max_fotos (1–12); texto/textoLongo → max (até 500 / 8000). condicao mostra a pergunta só quando outra cumpre a regra; alerta cria um alerta clínico quando a resposta está em «quando» (vazio = qualquer resposta diferente de «nao»).",
                "properties": {
                    "chave": {
                        "type": "string",
                        "pattern": "^[a-z][a-z0-9_]{0,39}$"
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "texto",
                            "textoLongo",
                            "escolha",
                            "multipla",
                            "escala",
                            "simnao",
                            "data",
                            "numero",
                            "grelha",
                            "fotografia",
                            "assinatura",
                            "info"
                        ]
                    },
                    "rotulo": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 300
                    },
                    "ajuda": {
                        "type": "string",
                        "maxLength": 500
                    },
                    "obrigatorio": {
                        "type": "boolean"
                    },
                    "preencher": {
                        "type": "boolean",
                        "default": true,
                        "description": "Pré-preencher com a resposta anterior."
                    },
                    "opcoes": {
                        "type": "array",
                        "maxItems": 60,
                        "items": {
                            "type": "object",
                            "properties": {
                                "valor": {
                                    "type": "string",
                                    "pattern": "^[a-z0-9][a-z0-9_\\-]{0,39}$"
                                },
                                "rotulo": {
                                    "type": "string",
                                    "maxLength": 200
                                },
                                "pontos": {
                                    "type": [
                                        "number",
                                        "null"
                                    ]
                                },
                                "alarme": {
                                    "type": "boolean"
                                }
                            }
                        }
                    },
                    "min": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "max": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "passo": {
                        "type": "integer",
                        "minimum": 1
                    },
                    "rotulo_min": {
                        "type": "string",
                        "maxLength": 60
                    },
                    "rotulo_max": {
                        "type": "string",
                        "maxLength": 60
                    },
                    "pontuar": {
                        "type": "boolean"
                    },
                    "alarme_min": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "alarme_max": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "unidade": {
                        "type": "string",
                        "maxLength": 20
                    },
                    "casas": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 3
                    },
                    "pontos_sim": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "alarme_sim": {
                        "type": "boolean"
                    },
                    "linhas": {
                        "type": "array",
                        "maxItems": 30,
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string",
                                    "pattern": "^[a-z][a-z0-9_]{0,39}$"
                                },
                                "rotulo": {
                                    "type": "string",
                                    "maxLength": 200
                                }
                            }
                        }
                    },
                    "colunas": {
                        "type": "array",
                        "maxItems": 12,
                        "items": {
                            "type": "object",
                            "properties": {
                                "valor": {
                                    "type": "string",
                                    "pattern": "^[a-z0-9][a-z0-9_\\-]{0,39}$"
                                },
                                "rotulo": {
                                    "type": "string",
                                    "maxLength": 80
                                },
                                "pontos": {
                                    "type": [
                                        "number",
                                        "null"
                                    ]
                                }
                            }
                        }
                    },
                    "vistas": {
                        "type": "array",
                        "maxItems": 12,
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string",
                                    "pattern": "^[a-z][a-z0-9_]{0,39}$"
                                },
                                "rotulo": {
                                    "type": "string",
                                    "maxLength": 120
                                },
                                "instrucoes": {
                                    "type": "string",
                                    "maxLength": 300
                                }
                            }
                        }
                    },
                    "max_fotos": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 12
                    },
                    "condicao": {
                        "type": "object",
                        "properties": {
                            "pergunta": {
                                "type": "string"
                            },
                            "operador": {
                                "type": "string",
                                "enum": [
                                    "=",
                                    "!=",
                                    ">",
                                    "<",
                                    "contem",
                                    "respondida"
                                ]
                            },
                            "valor": {
                                "type": "string",
                                "maxLength": 120
                            }
                        }
                    },
                    "alerta": {
                        "type": "object",
                        "properties": {
                            "tipo": {
                                "type": "string",
                                "enum": [
                                    "alergia",
                                    "medicacao",
                                    "condicao",
                                    "anticoagulante",
                                    "outro"
                                ]
                            },
                            "gravidade": {
                                "type": "string",
                                "enum": [
                                    "baixa",
                                    "media",
                                    "alta"
                                ],
                                "default": "media"
                            },
                            "quando": {
                                "type": "array",
                                "items": {
                                    "type": "string"
                                }
                            }
                        }
                    }
                }
            },
            "M1EsquemaFormulario": {
                "type": "object",
                "required": [
                    "passos"
                ],
                "properties": {
                    "passos": {
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 20,
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string"
                                },
                                "titulo": {
                                    "type": "string",
                                    "maxLength": 200
                                },
                                "descricao": {
                                    "type": "string",
                                    "maxLength": 1000
                                },
                                "seccoes": {
                                    "type": "array",
                                    "items": {
                                        "type": "object",
                                        "properties": {
                                            "chave": {
                                                "type": "string"
                                            },
                                            "titulo": {
                                                "type": "string",
                                                "maxLength": 200
                                            },
                                            "descricao": {
                                                "type": "string",
                                                "maxLength": 1000
                                            },
                                            "perguntas": {
                                                "type": "array",
                                                "items": {
                                                    "$ref": "#/components/schemas/M1Pergunta"
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "pontuacao": {
                        "type": "object",
                        "properties": {
                            "ativa": {
                                "type": "boolean"
                            },
                            "rotulo": {
                                "type": "string",
                                "maxLength": 80
                            },
                            "modo": {
                                "type": "string",
                                "enum": [
                                    "soma",
                                    "media",
                                    "pergunta"
                                ],
                                "default": "soma"
                            },
                            "pergunta": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "description": "Chave da pergunta que dá a pontuação (modo «pergunta»)."
                            },
                            "faixas": {
                                "type": "array",
                                "maxItems": 10,
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "min": {
                                            "type": [
                                                "number",
                                                "null"
                                            ]
                                        },
                                        "max": {
                                            "type": [
                                                "number",
                                                "null"
                                            ]
                                        },
                                        "rotulo": {
                                            "type": "string",
                                            "maxLength": 80
                                        },
                                        "tom": {
                                            "type": "string",
                                            "enum": [
                                                "marca",
                                                "ouro",
                                                "sucesso",
                                                "aviso",
                                                "perigo",
                                                "info",
                                                "neutro"
                                            ]
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "alarmes": {
                        "type": "object",
                        "properties": {
                            "departamento": {
                                "type": "string",
                                "enum": [
                                    "medico",
                                    "enfermagem",
                                    "tecnico",
                                    "comercial",
                                    "rececao",
                                    "administracao"
                                ],
                                "default": "enfermagem"
                            }
                        }
                    }
                },
                "example": {
                    "passos": [
                        {
                            "chave": "p1",
                            "titulo": "Saúde geral",
                            "descricao": "",
                            "seccoes": [
                                {
                                    "chave": "s1_1",
                                    "titulo": "Antecedentes",
                                    "descricao": "",
                                    "perguntas": [
                                        {
                                            "chave": "anticoagulantes",
                                            "tipo": "simnao",
                                            "rotulo": "Toma anticoagulantes?",
                                            "ajuda": "",
                                            "obrigatorio": true,
                                            "preencher": true,
                                            "pontos_sim": null,
                                            "alarme_sim": true,
                                            "alerta": {
                                                "tipo": "anticoagulante",
                                                "gravidade": "alta",
                                                "quando": [
                                                    "sim"
                                                ]
                                            }
                                        },
                                        {
                                            "chave": "qual_anticoagulante",
                                            "tipo": "texto",
                                            "rotulo": "Qual?",
                                            "ajuda": "",
                                            "obrigatorio": false,
                                            "preencher": true,
                                            "max": 200,
                                            "condicao": {
                                                "pergunta": "anticoagulantes",
                                                "operador": "=",
                                                "valor": "sim"
                                            }
                                        },
                                        {
                                            "chave": "impacto",
                                            "tipo": "escala",
                                            "rotulo": "Quanto o incomoda a queda de cabelo?",
                                            "ajuda": "",
                                            "obrigatorio": true,
                                            "preencher": false,
                                            "min": 0,
                                            "max": 10,
                                            "passo": 1,
                                            "rotulo_min": "Nada",
                                            "rotulo_max": "Muito",
                                            "pontuar": true,
                                            "alarme_min": null
                                        }
                                    ]
                                }
                            ]
                        }
                    ],
                    "pontuacao": {
                        "ativa": true,
                        "rotulo": "Impacto",
                        "modo": "soma",
                        "pergunta": null,
                        "faixas": [
                            {
                                "min": 0,
                                "max": 4,
                                "rotulo": "Baixo",
                                "tom": "sucesso"
                            },
                            {
                                "min": 5,
                                "max": 10,
                                "rotulo": "Elevado",
                                "tom": "aviso"
                            }
                        ]
                    },
                    "alarmes": {
                        "departamento": "enfermagem"
                    }
                }
            },
            "M1EditorFormulario": {
                "type": "object",
                "properties": {
                    "formulario": {
                        "$ref": "#/components/schemas/M1Formulario"
                    },
                    "esquema": {
                        "$ref": "#/components/schemas/M1EsquemaFormulario"
                    },
                    "tipos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "tipo": {
                                    "type": "string",
                                    "enum": [
                                        "texto",
                                        "textoLongo",
                                        "escolha",
                                        "multipla",
                                        "escala",
                                        "simnao",
                                        "data",
                                        "numero",
                                        "grelha",
                                        "fotografia",
                                        "assinatura",
                                        "info"
                                    ]
                                },
                                "rotulo": {
                                    "type": "string"
                                },
                                "icone": {
                                    "type": "string"
                                },
                                "descricao": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "versoes": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "versao": {
                                    "type": "integer"
                                },
                                "publicado_em": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "format": "date-time"
                                },
                                "publicado_por": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                }
                            }
                        }
                    },
                    "traducoes": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "idioma": {
                                    "type": "string",
                                    "enum": [
                                        "pt-PT",
                                        "pt-BR",
                                        "en",
                                        "es",
                                        "fr",
                                        "de"
                                    ]
                                },
                                "ativo": {
                                    "type": "boolean"
                                }
                            }
                        }
                    },
                    "respostas": {
                        "type": "integer",
                        "description": "Respostas recebidas (sem pendentes nem expiradas)."
                    },
                    "editavel": {
                        "type": "boolean"
                    },
                    "ia_traducao": {
                        "type": "boolean",
                        "description": "Tradução pelo assistente de IA da clínica configurada."
                    }
                }
            },
            "M1ItemResposta": {
                "type": "object",
                "properties": {
                    "chave": {
                        "type": "string"
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "texto",
                            "textoLongo",
                            "escolha",
                            "multipla",
                            "escala",
                            "simnao",
                            "data",
                            "numero",
                            "grelha",
                            "fotografia",
                            "assinatura",
                            "info"
                        ]
                    },
                    "seccao": {
                        "type": "string"
                    },
                    "rotulo": {
                        "type": "string"
                    },
                    "valor": {
                        "description": "Valor gravado (tipo conforme a pergunta)."
                    },
                    "texto": {
                        "type": "string",
                        "description": "Valor legível."
                    },
                    "alarme": {
                        "type": "boolean"
                    }
                }
            },
            "M1ResultadoResposta": {
                "type": "object",
                "properties": {
                    "resposta_id": {
                        "type": "integer"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "validado",
                            "por_validar"
                        ]
                    },
                    "pontuacao": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "faixa": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "rotulo": {
                                "type": "string"
                            },
                            "tom": {
                                "type": "string",
                                "enum": [
                                    "marca",
                                    "ouro",
                                    "sucesso",
                                    "aviso",
                                    "perigo",
                                    "info",
                                    "neutro"
                                ]
                            }
                        }
                    },
                    "alarme": {
                        "type": "boolean"
                    }
                }
            },
            "M1RespostaFormulario": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "formulario": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/M1Formulario"
                            },
                            {
                                "type": "null"
                            }
                        ]
                    },
                    "versao": {
                        "type": "integer"
                    },
                    "esquema": {
                        "$ref": "#/components/schemas/M1EsquemaFormulario"
                    },
                    "respostas": {
                        "type": "object",
                        "additionalProperties": true,
                        "description": "Chave da pergunta → valor (decifradas)."
                    },
                    "itens": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M1ItemResposta"
                        }
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "origem": {
                        "type": "string",
                        "enum": [
                            "paciente",
                            "equipa",
                            "agente",
                            "site"
                        ]
                    },
                    "origem_rotulo": {
                        "type": "string"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "pendente",
                            "por_validar",
                            "validado",
                            "rejeitado",
                            "expirado"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "pontuacao": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "faixa": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "rotulo": {
                                "type": "string"
                            },
                            "tom": {
                                "type": "string"
                            }
                        }
                    },
                    "alarme": {
                        "type": "boolean"
                    },
                    "preenchido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "validado_por": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Nome de quem validou."
                    },
                    "validado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "devolucao_motivo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "pode_validar": {
                        "type": "boolean"
                    }
                }
            },
            "M1Envio": {
                "type": "object",
                "description": "Resultado do envio da mensagem de serviço (a falta de contacto não falha o pedido: fica ok = false).",
                "properties": {
                    "ok": {
                        "type": "boolean"
                    },
                    "estado": {
                        "type": "string"
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "mensagem_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    }
                }
            },
            "M1PedidoFormulario": {
                "type": "object",
                "properties": {
                    "resposta_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "description": "Pedido criado (POST /formularios/{id}/pedidos)."
                    },
                    "id": {
                        "type": "integer",
                        "description": "Resposta devolvida (POST /validacoes/respostas/{id}/devolver)."
                    },
                    "ligacao": {
                        "type": "string",
                        "format": "uri"
                    },
                    "expira_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "description": "Prazo da ligação em ISO 8601 (com o fuso da clínica)."
                    },
                    "envio": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/M1Envio"
                            },
                            {
                                "type": "null"
                            }
                        ]
                    }
                }
            },
            "M1Consentimento": {
                "type": "object",
                "description": "Autorização em falta para recolher estas respostas: «tratamento_clinico» sempre e «fotografias_clinicas» quando o formulário tem perguntas de fotografia — só as que ainda não têm uma decisão «dado» válida. O ecrã mostra uma caixa por item, NUNCA pré-assinalada, e envia {finalidade: true} em «consentimentos». Sem paciente nem lead a lista vem vazia.",
                "properties": {
                    "finalidade": {
                        "type": "string",
                        "enum": [
                            "tratamento_clinico",
                            "fotografias_clinicas"
                        ]
                    },
                    "texto": {
                        "type": "string",
                        "description": "Texto do modelo aprovado da clínica nessa língua (resumido a 600 caracteres) ou o texto de omissão."
                    },
                    "modelo_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "description": "Modelo de consentimento aprovado usado (registado com a decisão)."
                    }
                }
            },
            "M1AvisoPrivacidade": {
                "type": "object",
                "description": "Aviso de privacidade em vigor do canal «formulario» (serviço único de avisos por canal da conformidade). Mostrar antes de recolher dados e devolver «testemunho» em «aviso_testemunho» no envio: o servidor regista a versão mostrada, a quem e quando.",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "canal": {
                        "type": "string"
                    },
                    "canal_rotulo": {
                        "type": "string"
                    },
                    "versao": {
                        "type": "integer"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "texto": {
                        "type": "string",
                        "description": "HTML sanitizado."
                    },
                    "idioma": {
                        "type": "string"
                    },
                    "publicado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "resumo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "contexto": {
                        "type": "string"
                    },
                    "testemunho": {
                        "type": "string",
                        "description": "Testemunho assinado da versão mostrada (válido 24 h)."
                    }
                }
            },
            "M1FormularioPublico": {
                "type": "object",
                "properties": {
                    "formulario": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "nome": {
                                "type": "string"
                            },
                            "descricao": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "idioma": {
                                "type": "string",
                                "enum": [
                                    "pt-PT",
                                    "pt-BR",
                                    "en",
                                    "es",
                                    "fr",
                                    "de"
                                ]
                            },
                            "tipo": {
                                "type": "string",
                                "enum": [
                                    "anamnese",
                                    "questionario_previo",
                                    "seguimento",
                                    "satisfacao",
                                    "pre_avaliacao",
                                    "tecnica",
                                    "triagem_sintomas",
                                    "outro"
                                ]
                            }
                        }
                    },
                    "esquema": {
                        "$ref": "#/components/schemas/M1EsquemaFormulario"
                    },
                    "valores": {
                        "type": "object",
                        "additionalProperties": true,
                        "description": "Pré-preenchimento: chave da pergunta → valor."
                    },
                    "consentimentos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M1Consentimento"
                        },
                        "description": "Acréscimo compatível: autorizações em falta (caixas por assinalar antes do envio)."
                    },
                    "aviso": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/M1AvisoPrivacidade"
                            },
                            {
                                "type": "null"
                            }
                        ],
                        "description": "Acréscimo compatível: aviso em vigor do canal «formulario»; null quando a clínica não publicou nenhum."
                    },
                    "expira_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "devolucao_motivo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Pedido de informação da clínica quando a resposta foi devolvida."
                    },
                    "clinica": {
                        "type": "string",
                        "description": "Nome da clínica."
                    },
                    "armadilha": {
                        "type": "string",
                        "description": "Acréscimo compatível: nome do campo armadilha, que tem de seguir vazio no envio."
                    }
                }
            },
            "M5Calculo": {
                "type": "object",
                "properties": {
                    "base": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "extras": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "desconto": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "iva_valor": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "total": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "moeda": {
                        "type": "string"
                    },
                    "total_moeda": {
                        "type": "number"
                    },
                    "preco_medio_enxerto": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "EUR"
                    },
                    "linhas": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "passos": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    }
                }
            },
            "M5Opcao": {
                "type": "object",
                "properties": {
                    "chave": {
                        "type": "string"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "titulo_en": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "enxertos": {
                        "type": "integer"
                    },
                    "sessoes": {
                        "type": "integer"
                    },
                    "quantidade": {
                        "type": "number"
                    },
                    "recomendada": {
                        "type": "boolean"
                    },
                    "calculo": {
                        "$ref": "#/components/schemas/M5Calculo"
                    },
                    "total_moeda": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "custos": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "description": "Só com financeiro.valores (todos)."
                    }
                }
            },
            "M5Proposta": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "numero": {
                        "type": "string"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "rascunho",
                            "enviada",
                            "vista",
                            "aceite",
                            "recusada",
                            "expirada"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "versao": {
                        "type": "integer"
                    },
                    "idioma": {
                        "type": "string"
                    },
                    "moeda": {
                        "type": "string"
                    },
                    "cambio": {
                        "type": "number"
                    },
                    "cambio_fixado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "pessoa": {
                        "type": "object",
                        "properties": {
                            "tipo": {
                                "type": "string"
                            },
                            "id": {
                                "type": "integer"
                            },
                            "nome": {
                                "type": "string"
                            }
                        }
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "plano_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "plano_versao": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "parametros_versao": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "procedimento": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "tabela": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "responsavel": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "opcoes": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M5Opcao"
                        }
                    },
                    "opcao_principal": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "opcao_aceite": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "linhas": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "extras_disponiveis": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "subtotal": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "desconto_pct": {
                        "type": "number"
                    },
                    "desconto_valor": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "desconto_estado": {
                        "type": "string",
                        "enum": [
                            "nao_aplicavel",
                            "pendente",
                            "aprovado",
                            "recusado"
                        ]
                    },
                    "desconto_estado_rotulo": {
                        "type": "string"
                    },
                    "desconto_motivo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "limite_desconto": {
                        "type": "number"
                    },
                    "iva_valor": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "total": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "total_moeda": {
                        "type": "number"
                    },
                    "prestacoes": {
                        "type": "object",
                        "properties": {
                            "escolhida": {
                                "type": "integer"
                            },
                            "sinal": {
                                "type": "number",
                                "x-unidade": "EUR"
                            },
                            "simulacao": {
                                "type": "array",
                                "items": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "condicoes": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "validade_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "dias_validade": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "enviada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "vista_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "vista_contagem": {
                        "type": "integer"
                    },
                    "aceite_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "aceite_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "recusada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "motivo_recusa": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "selada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "impressao_digital": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "impressao_legivel": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "plano": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "ligacao_publica": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "pdf": {
                        "type": "object",
                        "properties": {
                            "pt": {
                                "type": "string"
                            },
                            "en": {
                                "type": "string"
                            }
                        }
                    },
                    "cirurgia_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "historico": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "acoes": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "boolean"
                        }
                    },
                    "moedas": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "prestacoes_opcoes": {
                        "type": "array",
                        "items": {
                            "type": "integer"
                        }
                    },
                    "margem": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "EUR",
                        "description": "Só com financeiro.valores (todos)."
                    },
                    "custos_internos": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "pagamentos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M5Pagamento"
                        }
                    }
                }
            },
            "M5ResumoPropostas": {
                "type": "object",
                "properties": {
                    "kpis": {
                        "type": "object",
                        "properties": {
                            "rascunhos": {
                                "type": "integer"
                            },
                            "em_aberto": {
                                "type": "integer"
                            },
                            "valor_em_aberto": {
                                "type": "number",
                                "x-unidade": "EUR"
                            },
                            "vistas": {
                                "type": "integer"
                            },
                            "aceites_mes": {
                                "type": "integer"
                            },
                            "taxa_aceitacao_90d": {
                                "type": [
                                    "number",
                                    "null"
                                ]
                            },
                            "paradas": {
                                "type": "integer"
                            },
                            "descontos_pendentes": {
                                "type": "integer"
                            }
                        }
                    },
                    "linhas": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "grafico": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "x": {
                                    "type": "string"
                                },
                                "y": {
                                    "type": "number"
                                },
                                "serie": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "funil": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "x": {
                                    "type": "string"
                                },
                                "y": {
                                    "type": "number"
                                }
                            }
                        }
                    },
                    "pode": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "boolean"
                        }
                    }
                }
            },
            "M5PropostaPublica": {
                "type": "object",
                "description": "Vista do paciente: sem custos internos, margens, notas nem dados da equipa.",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "numero": {
                        "type": "string"
                    },
                    "estado": {
                        "type": "string"
                    },
                    "idioma": {
                        "type": "string"
                    },
                    "opcoes": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "linhas": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "total": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "prestacoes": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "anexo": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "condicoes": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "texto_aceitacao": {
                        "type": "string"
                    },
                    "validade_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "impressao_legivel": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "pagamentos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M5PagamentoPaciente"
                        }
                    }
                }
            },
            "M5Pagamento": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "proposta_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "sinal",
                            "intercalar",
                            "restante",
                            "consulta",
                            "teleconsulta",
                            "tratamento",
                            "outro",
                            "adiantamento",
                            "pre_pagamento",
                            "vale",
                            "comparticipacao"
                        ]
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "descricao": {
                        "type": "string"
                    },
                    "valor": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "moeda": {
                        "type": "string"
                    },
                    "metodo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "metodo_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "pendente",
                            "pago",
                            "falhado",
                            "expirado",
                            "reembolsado",
                            "cancelado"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "mb": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "entidade": {
                                "type": "string"
                            },
                            "referencia": {
                                "type": "string"
                            },
                            "valor": {
                                "type": "number",
                                "x-unidade": "EUR"
                            },
                            "validade": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            }
                        }
                    },
                    "telefone_mascarado": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "ligacao_url": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "gateway": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "confirmacao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "pedido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "pago_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "vence_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "vencido": {
                        "type": "boolean"
                    },
                    "caixa_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "recebido_por": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "documento": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/M5Documento"
                            },
                            {
                                "type": "null"
                            }
                        ]
                    },
                    "acoes": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "boolean"
                        }
                    }
                }
            },
            "M5PagamentoPaciente": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "tipo": {
                        "type": "string"
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "descricao": {
                        "type": "string"
                    },
                    "valor": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "estado": {
                        "type": "string"
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "metodo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "mb": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "telefone_mascarado": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "ligacao_url": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "vence_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "pago_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "M5PlanoPagamentos": {
                "type": "object",
                "properties": {
                    "episodio": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "paciente": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "nome": {
                                "type": "string"
                            }
                        }
                    },
                    "propostas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "numero": {
                                    "type": "string"
                                },
                                "titulo": {
                                    "type": "string"
                                },
                                "total": {
                                    "type": "number",
                                    "x-unidade": "EUR"
                                },
                                "aceite_em": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "format": "date-time"
                                }
                            }
                        }
                    },
                    "totais": {
                        "type": "object",
                        "properties": {
                            "previsto": {
                                "type": "number",
                                "x-unidade": "EUR"
                            },
                            "pago": {
                                "type": "number",
                                "x-unidade": "EUR"
                            },
                            "pendente": {
                                "type": "number",
                                "x-unidade": "EUR"
                            },
                            "vencido": {
                                "type": "number",
                                "x-unidade": "EUR"
                            },
                            "saldo": {
                                "type": "number",
                                "x-unidade": "EUR"
                            },
                            "progresso": {
                                "type": [
                                    "number",
                                    "null"
                                ]
                            }
                        }
                    },
                    "pagamentos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M5Pagamento"
                        }
                    },
                    "documentos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M5Documento"
                        }
                    },
                    "metodos": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "presenciais": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "mbway_limite": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "caixa_aberta": {
                        "type": "boolean"
                    },
                    "pode": {
                        "type": "object",
                        "properties": {
                            "editar": {
                                "type": "boolean"
                            },
                            "faturar": {
                                "type": "boolean"
                            }
                        }
                    }
                }
            },
            "M5Documento": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "FT",
                            "FR",
                            "FS",
                            "RG",
                            "NC"
                        ]
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "numero": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "atcud": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "qr_codigo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "fornecedor": {
                        "type": "string"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "pedido",
                            "emitido",
                            "anulado",
                            "erro"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "base": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "iva": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "total": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "iva_taxa": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "descricao_servico": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "cliente_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "erro": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "emitido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "enviado_paciente_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "pagamento_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "documento_origem_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "tem_pdf": {
                        "type": "boolean"
                    },
                    "acoes": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "boolean"
                        }
                    }
                }
            },
            "M5Caixa": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "string",
                        "format": "date"
                    },
                    "hoje": {
                        "type": "boolean"
                    },
                    "caixa": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/M5CaixaDia"
                            },
                            {
                                "type": "null"
                            }
                        ]
                    },
                    "presenciais": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "pode_editar": {
                        "type": "boolean"
                    }
                }
            },
            "M5CaixaDia": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "data": {
                        "type": "string",
                        "format": "date"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "aberta",
                            "fechada"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "saldo_inicial": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "aberta_por": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "aberta_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "fechada_por": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "fechada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "por_metodo": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "number",
                            "x-unidade": "EUR"
                        }
                    },
                    "reforcos": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "levantamentos": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "esperado": {
                        "type": "object",
                        "properties": {
                            "numerario": {
                                "type": "number",
                                "x-unidade": "EUR"
                            },
                            "cartao": {
                                "type": "number",
                                "x-unidade": "EUR"
                            },
                            "outros": {
                                "type": "number",
                                "x-unidade": "EUR"
                            }
                        }
                    },
                    "total_recebido": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "eletronicos_do_dia": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "contagem": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "contado": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "EUR"
                    },
                    "diferenca": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "EUR"
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "n_pagamentos": {
                        "type": "integer"
                    },
                    "pode": {
                        "type": "object",
                        "properties": {
                            "editar": {
                                "type": "boolean"
                            }
                        }
                    },
                    "linhas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "tipo": {
                                    "type": "string",
                                    "enum": [
                                        "pagamento",
                                        "reforco",
                                        "levantamento"
                                    ]
                                },
                                "id": {
                                    "type": "integer"
                                },
                                "hora": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "format": "date-time"
                                },
                                "descricao": {
                                    "type": "string"
                                },
                                "paciente_id": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "paciente": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "metodo": {
                                    "type": "string"
                                },
                                "metodo_rotulo": {
                                    "type": "string"
                                },
                                "valor": {
                                    "type": "number",
                                    "x-unidade": "EUR"
                                },
                                "por": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                }
                            }
                        }
                    }
                }
            },
            "M5CaixaResumo": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "data": {
                        "type": "string",
                        "format": "date"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "aberta",
                            "fechada"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "saldo_inicial": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "total": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "contado": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "EUR"
                    },
                    "diferenca": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "EUR"
                    }
                }
            },
            "M5Comissoes": {
                "type": "object",
                "properties": {
                    "de": {
                        "type": "string",
                        "format": "date"
                    },
                    "ate": {
                        "type": "string",
                        "format": "date"
                    },
                    "tipo": {
                        "type": "string"
                    },
                    "totais": {
                        "type": "object",
                        "properties": {
                            "devido": {
                                "type": "number",
                                "x-unidade": "EUR"
                            },
                            "pago": {
                                "type": "number",
                                "x-unidade": "EUR"
                            },
                            "previsto": {
                                "type": "number",
                                "x-unidade": "EUR"
                            },
                            "estornado": {
                                "type": "number",
                                "x-unidade": "EUR"
                            }
                        }
                    },
                    "linhas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "tipo": {
                                    "type": "string",
                                    "enum": [
                                        "comissao",
                                        "honorario"
                                    ]
                                },
                                "id": {
                                    "type": "integer"
                                },
                                "utilizador_id": {
                                    "type": "integer"
                                },
                                "pessoa": {
                                    "type": "string"
                                },
                                "estado": {
                                    "type": "string"
                                },
                                "estado_rotulo": {
                                    "type": "string"
                                },
                                "valor": {
                                    "type": "number",
                                    "x-unidade": "EUR"
                                },
                                "base": {
                                    "type": [
                                        "number",
                                        "null"
                                    ]
                                },
                                "taxa": {
                                    "type": [
                                        "number",
                                        "null"
                                    ]
                                },
                                "proposta_id": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "cirurgia_id": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "descricao": {
                                    "type": "string"
                                },
                                "data": {
                                    "type": "string"
                                },
                                "paga_em": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "format": "date-time"
                                }
                            }
                        }
                    },
                    "pessoas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "utilizador_id": {
                                    "type": "integer"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "devido": {
                                    "type": "number",
                                    "x-unidade": "EUR"
                                },
                                "pago": {
                                    "type": "number",
                                    "x-unidade": "EUR"
                                },
                                "previsto": {
                                    "type": "number",
                                    "x-unidade": "EUR"
                                },
                                "estornado": {
                                    "type": "number",
                                    "x-unidade": "EUR"
                                },
                                "n": {
                                    "type": "integer"
                                }
                            }
                        }
                    },
                    "grafico": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "x": {
                                    "type": "string"
                                },
                                "y": {
                                    "type": "number",
                                    "x-unidade": "EUR"
                                }
                            }
                        }
                    },
                    "pode": {
                        "type": "object",
                        "properties": {
                            "pagar": {
                                "type": "boolean"
                            },
                            "ver_todos": {
                                "type": "boolean"
                            }
                        }
                    }
                }
            },
            "M5Carteira": {
                "type": "object",
                "properties": {
                    "paciente_id": {
                        "type": "integer"
                    },
                    "saldo": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "saldo_centimos": {
                        "type": "integer"
                    },
                    "reembolsavel": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "reembolsavel_centimos": {
                        "type": "integer"
                    },
                    "totais": {
                        "type": "object",
                        "properties": {
                            "dinheiro": {
                                "type": "number",
                                "x-unidade": "EUR"
                            },
                            "creditos": {
                                "type": "number",
                                "x-unidade": "EUR"
                            },
                            "usos": {
                                "type": "number",
                                "x-unidade": "EUR"
                            },
                            "devolucoes": {
                                "type": "number",
                                "x-unidade": "EUR"
                            }
                        }
                    },
                    "movimentos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "tipo": {
                                    "type": "string",
                                    "enum": [
                                        "adiantamento",
                                        "pre_pagamento",
                                        "credito",
                                        "uso",
                                        "devolucao",
                                        "estorno"
                                    ]
                                },
                                "tipo_rotulo": {
                                    "type": "string"
                                },
                                "valor": {
                                    "type": "number",
                                    "x-unidade": "EUR"
                                },
                                "valor_centimos": {
                                    "type": "integer"
                                },
                                "saldo_apos": {
                                    "type": "number",
                                    "x-unidade": "EUR"
                                },
                                "metodo": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "metodo_rotulo": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "motivo": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "pagamento_id": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "estorno_de_id": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "estornado": {
                                    "type": "boolean"
                                },
                                "estornavel": {
                                    "type": "boolean"
                                },
                                "local": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "por": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "data": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "format": "date-time"
                                }
                            }
                        }
                    },
                    "metodos_devolucao": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "pode": {
                        "type": "object",
                        "properties": {
                            "usar": {
                                "type": "boolean"
                            },
                            "devolver": {
                                "type": "boolean"
                            },
                            "creditar": {
                                "type": "boolean"
                            },
                            "carregar": {
                                "type": "boolean"
                            }
                        }
                    }
                }
            },
            "M5Vale": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "codigo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "codigo_fim": {
                        "type": "string"
                    },
                    "valor_inicial": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "saldo": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "saldo_centimos": {
                        "type": "integer"
                    },
                    "validade": {
                        "type": "string",
                        "format": "date"
                    },
                    "finalidade": {
                        "type": "string",
                        "enum": [
                            "multipla",
                            "unica"
                        ]
                    },
                    "finalidade_rotulo": {
                        "type": "string"
                    },
                    "procedimento": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "por_pagar",
                            "ativo",
                            "esgotado",
                            "expirado",
                            "anulado"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "comprador_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "beneficiario_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "mensagem": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "pagamento_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "ativado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "local": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "movimentos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "tipo": {
                                    "type": "string"
                                },
                                "tipo_rotulo": {
                                    "type": "string"
                                },
                                "valor": {
                                    "type": "number",
                                    "x-unidade": "EUR"
                                },
                                "saldo_apos": {
                                    "type": "number",
                                    "x-unidade": "EUR"
                                },
                                "pagamento_id": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "motivo": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "data": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "format": "date-time"
                                }
                            }
                        }
                    }
                }
            },
            "M5Terminal": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "fornecedor": {
                        "type": "string",
                        "enum": [
                            "sumup",
                            "stripe"
                        ]
                    },
                    "fornecedor_rotulo": {
                        "type": "string"
                    },
                    "local_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "local": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "estado": {
                        "type": "string"
                    },
                    "ultimo_estado": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            },
            "M5PedidoTerminal": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "terminal_id": {
                        "type": "integer"
                    },
                    "terminal": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "fornecedor": {
                        "type": "string"
                    },
                    "fornecedor_rotulo": {
                        "type": "string"
                    },
                    "pagamento_id": {
                        "type": "integer"
                    },
                    "referencia": {
                        "type": "string"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "enviado",
                            "pago",
                            "falhado",
                            "cancelado",
                            "expirado"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "valor": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "valor_centimos": {
                        "type": "integer"
                    },
                    "mensagem": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "concluido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "acoes": {
                        "type": "object",
                        "properties": {
                            "cancelar": {
                                "type": "boolean"
                            }
                        }
                    }
                }
            },
            "M5Reconciliacao": {
                "type": "object",
                "properties": {
                    "caixa_id": {
                        "type": "integer"
                    },
                    "data": {
                        "type": "string",
                        "format": "date"
                    },
                    "local_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "cartao_manual": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "terminais": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "terminal": {
                                    "$ref": "#/components/schemas/M5Terminal"
                                },
                                "disponivel": {
                                    "type": "boolean"
                                },
                                "pedidos": {
                                    "type": "integer"
                                },
                                "total_registado": {
                                    "type": "number",
                                    "x-unidade": "EUR"
                                },
                                "total_fornecedor": {
                                    "type": [
                                        "number",
                                        "null"
                                    ],
                                    "x-unidade": "EUR"
                                },
                                "diferenca": {
                                    "type": [
                                        "number",
                                        "null"
                                    ],
                                    "x-unidade": "EUR"
                                },
                                "confirmados_agora": {
                                    "type": "integer"
                                },
                                "sem_registo": {
                                    "type": "array",
                                    "items": {
                                        "type": "object",
                                        "properties": {
                                            "externo_id": {
                                                "type": "string"
                                            },
                                            "referencia": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            },
                                            "valor": {
                                                "type": "number",
                                                "x-unidade": "EUR"
                                            },
                                            "quando": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            },
            "M5Reparticao": {
                "type": "object",
                "properties": {
                    "conta": {
                        "type": "object"
                    },
                    "convencao": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "ato": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "preco": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "pagador": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "paciente": {
                        "type": "number",
                        "x-unidade": "EUR"
                    },
                    "exige_autorizacao": {
                        "type": "boolean"
                    },
                    "avisos": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    }
                }
            },
            "M5ContaExtrato": {
                "type": "object",
                "properties": {
                    "conta": {
                        "type": "object"
                    },
                    "totais": {
                        "type": "object",
                        "properties": {
                            "pendente": {
                                "type": "number",
                                "x-unidade": "EUR"
                            },
                            "pago": {
                                "type": "number",
                                "x-unidade": "EUR"
                            },
                            "vencido": {
                                "type": "number",
                                "x-unidade": "EUR"
                            }
                        }
                    },
                    "subcontas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "paciente_id": {
                                    "type": "integer"
                                },
                                "paciente": {
                                    "type": "string"
                                },
                                "relacao": {
                                    "type": "string"
                                },
                                "relacao_rotulo": {
                                    "type": "string"
                                },
                                "numero_beneficiario": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "cobertura_pct": {
                                    "type": "number"
                                },
                                "limite": {
                                    "type": [
                                        "number",
                                        "null"
                                    ],
                                    "x-unidade": "EUR"
                                },
                                "usado_ano": {
                                    "type": "number",
                                    "x-unidade": "EUR"
                                },
                                "disponivel_ano": {
                                    "type": [
                                        "number",
                                        "null"
                                    ],
                                    "x-unidade": "EUR"
                                },
                                "pendente": {
                                    "type": "number",
                                    "x-unidade": "EUR"
                                },
                                "pago": {
                                    "type": "number",
                                    "x-unidade": "EUR"
                                },
                                "vencido": {
                                    "type": "number",
                                    "x-unidade": "EUR"
                                },
                                "n_pagamentos": {
                                    "type": "integer"
                                },
                                "ativa": {
                                    "type": "boolean"
                                },
                                "valida_ate": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "format": "date"
                                }
                            }
                        }
                    },
                    "pagamentos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M5Pagamento"
                        }
                    },
                    "documentos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M5Documento"
                        }
                    },
                    "pode": {
                        "type": "object",
                        "properties": {
                            "editar": {
                                "type": "boolean"
                            }
                        }
                    }
                }
            },
            "M5Consumo": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "artigo_id": {
                        "type": "integer"
                    },
                    "artigo": {
                        "type": "string"
                    },
                    "quantidade": {
                        "type": "number"
                    },
                    "unidade": {
                        "type": "string"
                    },
                    "lote": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "validade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "custo": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "EUR"
                    }
                }
            },
            "M2AvisoCanal": {
                "type": [
                    "object",
                    "null"
                ],
                "description": "Aviso de privacidade em vigor do canal, com o testemunho da versão mostrada.",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "canal": {
                        "type": "string"
                    },
                    "canal_rotulo": {
                        "type": "string"
                    },
                    "versao": {
                        "type": "integer"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "texto": {
                        "type": "string",
                        "description": "HTML sanitizado."
                    },
                    "idioma": {
                        "type": "string"
                    },
                    "publicado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "resumo": {
                        "type": "string",
                        "description": "SHA-256 do texto publicado."
                    },
                    "contexto": {
                        "type": "string"
                    },
                    "testemunho": {
                        "type": "string",
                        "description": "Testemunho assinado (24 h)."
                    }
                }
            },
            "M2AvisoMostrado": {
                "type": "object",
                "description": "Uma exibição registada (imutável) de um aviso de privacidade.",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "canal": {
                        "type": "string"
                    },
                    "canal_rotulo": {
                        "type": "string"
                    },
                    "aviso": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "versao": {
                                "type": "integer"
                            },
                            "titulo": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "idioma": {
                                "type": "string"
                            }
                        }
                    },
                    "contexto": {
                        "type": "string"
                    },
                    "contexto_rotulo": {
                        "type": "string"
                    },
                    "meio": {
                        "type": "string",
                        "enum": [
                            "web",
                            "app",
                            "externo",
                            "voz",
                            "video",
                            "presencial",
                            "api"
                        ]
                    },
                    "meio_rotulo": {
                        "type": "string"
                    },
                    "prova": {
                        "type": "string",
                        "enum": [
                            "testemunho",
                            "envio",
                            "servidor"
                        ]
                    },
                    "prova_rotulo": {
                        "type": "string"
                    },
                    "titular_tipo": {
                        "type": "string"
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "portal_conta_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "ref_tipo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "ref_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "mostrado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "registado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "texto_hash": {
                        "type": "string"
                    },
                    "impressao_digital": {
                        "type": "string"
                    },
                    "texto_integro": {
                        "type": [
                            "boolean",
                            "null"
                        ]
                    },
                    "linha_integra": {
                        "type": "boolean"
                    }
                }
            },
            "M2PedidoCmd": {
                "type": "object",
                "description": "Pedido de assinatura com a Chave Móvel Digital (sem segredos: nunca o PIN nem o número completo).",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "documento_id": {
                        "type": "integer"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "codigo_enviado",
                            "assinado",
                            "falhou",
                            "expirado",
                            "cancelado"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "telemovel": {
                        "type": "string",
                        "description": "Máscara (+351 9•••••678)."
                    },
                    "titular": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "ambiente": {
                        "type": "string"
                    },
                    "pedido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "expira_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "segundos_restantes": {
                        "type": "integer"
                    },
                    "tentativas": {
                        "type": "integer"
                    },
                    "concluido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "mensagem": {
                        "type": "string"
                    }
                }
            },
            "M2Erro": {
                "type": "object",
                "required": [
                    "codigo",
                    "mensagem"
                ],
                "properties": {
                    "codigo": {
                        "type": "string",
                        "enum": [
                            "validacao",
                            "nao_autenticado",
                            "sem_permissao",
                            "nao_encontrado",
                            "acao_recusada",
                            "limite_excedido"
                        ]
                    },
                    "mensagem": {
                        "type": "string"
                    },
                    "campos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        }
                    }
                },
                "x-catalogo-erros": {
                    "validacao": {
                        "http": 422,
                        "descricao": "Decisão em falta, assinatura em falta, reflexão em curso, campos do modelo, código errado, motivo em falta."
                    },
                    "acao_recusada": {
                        "http": 409,
                        "descricao": "O envio da ligação ou do código falhou (sem contacto, serviço de mensagens indisponível)."
                    }
                }
            },
            "M2RespostaErro": {
                "type": "object",
                "required": [
                    "ok",
                    "erro"
                ],
                "properties": {
                    "ok": {
                        "const": false
                    },
                    "erro": {
                        "$ref": "#/components/schemas/M2Erro"
                    }
                }
            },
            "M2Entrega": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "modelo_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "modelo_versao": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "entregue_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "liberta_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "segundos_restantes": {
                        "type": "integer",
                        "x-unidade": "s"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "entregue",
                            "assinado",
                            "recusado",
                            "anulado"
                        ]
                    },
                    "documento_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "canal": {
                        "type": "string"
                    }
                }
            },
            "M2ModeloRecolha": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "chave": {
                        "type": "string"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "finalidade": {
                        "type": "string",
                        "enum": [
                            "tratamento_clinico",
                            "fotografias_clinicas",
                            "imagens_comunicacao",
                            "captura_3d",
                            "gravacao_chamadas",
                            "gravacao_video",
                            "ia",
                            "agente_voz",
                            "marketing",
                            "partilha_terceiros",
                            "teleconsulta",
                            "cirurgico",
                            "contacto"
                        ]
                    },
                    "finalidade_rotulo": {
                        "type": "string"
                    },
                    "base_legal": {
                        "type": "string"
                    },
                    "base_legal_rotulo": {
                        "type": "string"
                    },
                    "informativo": {
                        "type": "boolean",
                        "description": "O fundamento não é o consentimento: o paciente toma conhecimento."
                    },
                    "obrigatorio": {
                        "type": "boolean"
                    },
                    "escrito": {
                        "type": "boolean",
                        "description": "Exige assinatura do paciente quando dado."
                    },
                    "versao": {
                        "type": "integer"
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "idioma": {
                        "type": "string"
                    },
                    "texto": {
                        "type": "string",
                        "description": "HTML sanitizado."
                    },
                    "reflexao_horas": {
                        "type": "integer",
                        "x-unidade": "h"
                    },
                    "estado_atual": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "decisao": {
                                "type": "string"
                            },
                            "decisao_rotulo": {
                                "type": "string"
                            },
                            "em": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            },
                            "versao": {
                                "type": [
                                    "integer",
                                    "null"
                                ]
                            },
                            "desatualizado": {
                                "type": "boolean"
                            },
                            "falta_medico": {
                                "type": "boolean"
                            }
                        }
                    },
                    "entrega": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/M2Entrega"
                            },
                            {
                                "type": "null"
                            }
                        ]
                    },
                    "cirurgico": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "valido": {
                                "type": "boolean"
                            },
                            "motivos": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "codigo": {
                                            "type": "string",
                                            "enum": [
                                                "sem_consentimento",
                                                "recusado",
                                                "revogado",
                                                "tecnica_diferente",
                                                "sem_informacao",
                                                "reflexao",
                                                "sem_assinatura_medico",
                                                "plano_alterado"
                                            ]
                                        },
                                        "texto": {
                                            "type": "string"
                                        }
                                    }
                                }
                            },
                            "plano": {
                                "type": [
                                    "object",
                                    "null"
                                ]
                            }
                        }
                    }
                }
            },
            "M2Recolha": {
                "type": "object",
                "properties": {
                    "paciente": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "numero": {
                                "type": "string"
                            },
                            "nome": {
                                "type": "string"
                            },
                            "idioma": {
                                "type": "string"
                            },
                            "tem_email": {
                                "type": "boolean"
                            },
                            "tem_telefone": {
                                "type": "boolean"
                            },
                            "portal_ativo": {
                                "type": "boolean"
                            }
                        }
                    },
                    "episodio": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "episodios": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "aviso": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "canal": {
                                "type": "string"
                            },
                            "versao": {
                                "type": "integer"
                            },
                            "titulo": {
                                "type": "string"
                            },
                            "texto": {
                                "type": "string"
                            },
                            "visto_em": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            }
                        }
                    },
                    "modelos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/M2ModeloRecolha"
                        }
                    },
                    "medicos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "cedula": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                }
                            }
                        }
                    },
                    "agora": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "pode_editar": {
                        "type": "boolean"
                    }
                }
            },
            "M2Prova": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "paciente": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "finalidade": {
                        "type": "string"
                    },
                    "finalidade_rotulo": {
                        "type": "string"
                    },
                    "decisao": {
                        "type": "string"
                    },
                    "decisao_rotulo": {
                        "type": "string"
                    },
                    "canal": {
                        "type": "string"
                    },
                    "canal_rotulo": {
                        "type": "string"
                    },
                    "modelo": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "texto": {
                        "type": "string"
                    },
                    "texto_hash": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "texto_integro": {
                        "type": [
                            "boolean",
                            "null"
                        ]
                    },
                    "informacao_entregue_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "assinado_paciente_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "assinado_medico_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "medico": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "recolhido_por": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "plano_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "dispositivo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "ip": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "impressao_digital": {
                        "type": "string"
                    },
                    "registado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "assinatura": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "ficheiro_id": {
                                "type": "integer"
                            },
                            "sha256": {
                                "type": "string"
                            },
                            "url": {
                                "type": "string"
                            }
                        }
                    },
                    "assinatura_medico": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "entrega": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "entidade": {
                        "type": "object"
                    }
                }
            },
            "M2ModeloDocumento": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "chave": {
                        "type": "string"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "proposta",
                            "consentimento",
                            "instrucoes",
                            "declaracao",
                            "relatorio",
                            "alta",
                            "carta"
                        ]
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "versao": {
                        "type": "integer"
                    },
                    "clinico": {
                        "type": "boolean"
                    },
                    "assinatura": {
                        "type": "boolean"
                    },
                    "assinatura_medico": {
                        "type": "boolean"
                    },
                    "partilhar_padrao": {
                        "type": "boolean"
                    },
                    "campos_extra": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string"
                                },
                                "rotulo": {
                                    "type": "string"
                                },
                                "tipo": {
                                    "type": "string",
                                    "enum": [
                                        "texto",
                                        "textoLongo",
                                        "data",
                                        "numero"
                                    ]
                                },
                                "obrigatorio": {
                                    "type": "boolean"
                                }
                            }
                        }
                    }
                }
            },
            "M2Documento": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "numero": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "tipo": {
                        "type": "string"
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "clinico": {
                        "type": "boolean"
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "modelo_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "modelo_versao": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "emitido",
                            "enviado",
                            "assinado",
                            "anulado"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "codigo_verificacao": {
                        "type": "string"
                    },
                    "url_verificacao": {
                        "type": "string"
                    },
                    "conteudo_hash": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "assinatura_tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "ecra",
                            "codigo",
                            "qualificada",
                            null
                        ]
                    },
                    "assinatura_canal": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "assinatura_destino": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Mascarado."
                    },
                    "assinatura_expira": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "assinado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "assinado_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "libertado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "description": "Fim do período de reflexão (consentimentos enviados para casa)."
                    },
                    "partilhado_paciente": {
                        "type": "boolean"
                    },
                    "enviado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "anulado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "anulado_motivo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "tem_pdf": {
                        "type": "boolean"
                    },
                    "certificado": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "pode_ver_conteudo": {
                        "type": "boolean"
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "conteudo": {
                        "type": "string",
                        "description": "HTML; só com pode_ver_conteudo."
                    },
                    "paciente": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "assinatura_medico": {
                        "type": "boolean"
                    },
                    "eventos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "em": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "format": "date-time"
                                },
                                "acao": {
                                    "type": "string"
                                },
                                "acao_rotulo": {
                                    "type": "string"
                                },
                                "quem": {
                                    "type": "string"
                                },
                                "origem": {
                                    "type": "string"
                                },
                                "detalhe": {
                                    "type": [
                                        "object",
                                        "null"
                                    ]
                                },
                                "motivo": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                }
                            }
                        }
                    },
                    "pode_editar": {
                        "type": "boolean"
                    }
                }
            },
            "M2Verificacao": {
                "type": "object",
                "properties": {
                    "valido": {
                        "type": "boolean"
                    },
                    "estado": {
                        "type": "string"
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "numero": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "tipo": {
                        "type": "string"
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "codigo_verificacao": {
                        "type": "string"
                    },
                    "emitido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "assinado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "assinatura_tipo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "anulado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "conteudo_hash": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "ficheiro_sha256": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "titular_iniciais": {
                        "type": "string"
                    },
                    "medico": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "nome": {
                                "type": "string"
                            },
                            "cedula": {
                                "type": "string"
                            }
                        }
                    },
                    "entidade": {
                        "type": "object",
                        "properties": {
                            "nome": {
                                "type": "string"
                            },
                            "nome_legal": {
                                "type": "string"
                            },
                            "nif": {
                                "type": "string"
                            },
                            "ers_registo": {
                                "type": "string"
                            },
                            "licenca_numero": {
                                "type": "string"
                            },
                            "morada": {
                                "type": "string"
                            }
                        }
                    }
                }
            },
            "M2Painel": {
                "type": "object",
                "properties": {
                    "atualizado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "kpis": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string"
                                },
                                "rotulo": {
                                    "type": "string"
                                },
                                "valor": {
                                    "type": "integer"
                                },
                                "atrasados": {
                                    "type": "integer"
                                },
                                "tom": {
                                    "type": "string"
                                },
                                "ligacao": {
                                    "type": "object",
                                    "properties": {
                                        "web": {
                                            "type": "string"
                                        },
                                        "app": {
                                            "type": "string"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "pedidos": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "reclamacoes": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "incidentes": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "alertas": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "subcontratantes": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "subcontratantes_plataforma": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "rat": {
                        "type": "object"
                    },
                    "formacoes": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "ers": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "revisao": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "consentimentos": {
                        "type": "object"
                    },
                    "equipamentos": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "modelos_por_aprovar": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "conservacao": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "encarregado": {
                        "type": "object",
                        "properties": {
                            "nome": {
                                "type": "string"
                            },
                            "email": {
                                "type": "string"
                            }
                        }
                    },
                    "permissoes": {
                        "type": "object",
                        "properties": {
                            "editar": {
                                "type": "boolean"
                            },
                            "alertas": {
                                "type": "boolean"
                            },
                            "alertas_editar": {
                                "type": "boolean"
                            },
                            "revisao": {
                                "type": "boolean"
                            },
                            "revisao_editar": {
                                "type": "boolean"
                            },
                            "exportar": {
                                "type": "boolean"
                            }
                        }
                    }
                }
            },
            "M2Revisao": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "periodo": {
                        "type": "string",
                        "description": "Trimestre, ex.: 2026-T4."
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "em_curso",
                            "concluida"
                        ]
                    },
                    "iniciada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "revisto_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "revisto_por": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "utilizadores_n": {
                        "type": "integer"
                    },
                    "sensiveis_n": {
                        "type": "integer"
                    },
                    "alteracoes": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "pessoas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "perfil": {
                                    "type": "string"
                                },
                                "direcao_clinica": {
                                    "type": "boolean"
                                },
                                "global": {
                                    "type": "boolean"
                                },
                                "segundo_fator": {
                                    "type": "boolean"
                                },
                                "rede_restrita": {
                                    "type": "boolean"
                                },
                                "ultimo_acesso_em": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "format": "date-time"
                                },
                                "sem_acesso_90d": {
                                    "type": "boolean"
                                },
                                "delegacoes": {
                                    "type": "integer"
                                },
                                "emergencias_90d": {
                                    "type": "integer"
                                },
                                "alertas_90d": {
                                    "type": "integer"
                                },
                                "clinico": {
                                    "type": "boolean"
                                },
                                "atencao": {
                                    "type": "boolean"
                                },
                                "modulos": {
                                    "type": "array",
                                    "items": {
                                        "type": "object",
                                        "properties": {
                                            "modulo": {
                                                "type": "string"
                                            },
                                            "rotulo": {
                                                "type": "string"
                                            },
                                            "nivel": {
                                                "type": "string"
                                            },
                                            "ambito": {
                                                "type": "string"
                                            },
                                            "origem": {
                                                "type": "string"
                                            },
                                            "clinico": {
                                                "type": "boolean"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            },
            "M2Acessos": {
                "type": "object",
                "properties": {
                    "linhas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "em": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "format": "date-time"
                                },
                                "quem": {
                                    "type": "string"
                                },
                                "ator_tipo": {
                                    "type": "string"
                                },
                                "perfil": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "perfil_rotulo": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "acao": {
                                    "type": "string"
                                },
                                "acao_rotulo": {
                                    "type": "string"
                                },
                                "recurso": {
                                    "type": "string"
                                },
                                "recurso_rotulo": {
                                    "type": "string"
                                },
                                "origem": {
                                    "type": "string"
                                },
                                "motivo": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "emergencia": {
                                    "type": "boolean"
                                }
                            }
                        }
                    },
                    "resumo": {
                        "type": "object",
                        "properties": {
                            "total": {
                                "type": "integer"
                            },
                            "pessoas": {
                                "type": "integer"
                            },
                            "perfis": {
                                "type": "integer"
                            },
                            "emergencias": {
                                "type": "integer"
                            },
                            "ultimo": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            },
                            "limitado": {
                                "type": "boolean"
                            }
                        }
                    },
                    "por_dia": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "x": {
                                    "type": "string",
                                    "format": "date"
                                },
                                "y": {
                                    "type": "integer"
                                }
                            }
                        }
                    },
                    "pessoas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "nome": {
                                    "type": "string"
                                },
                                "perfil": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "perfil_chave": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "acessos": {
                                    "type": "integer"
                                },
                                "ultimo": {
                                    "type": "string"
                                },
                                "ultimo_iso": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "format": "date-time"
                                },
                                "emergencia": {
                                    "type": "boolean"
                                }
                            }
                        }
                    },
                    "por_acao": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "x": {
                                    "type": "string"
                                },
                                "y": {
                                    "type": "integer"
                                },
                                "acao": {
                                    "type": "string"
                                }
                            }
                        }
                    }
                }
            },
            "CrmCartaoFunil": {
                "type": "object",
                "description": "Cartão de um lead no funil (sem dados clínicos). «valor» só com a permissão financeiro.valores.",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "responsavel": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "nome": {
                                "type": "string"
                            },
                            "cor": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    },
                    "origem": {
                        "type": "string",
                        "enum": [
                            "site",
                            "pre_avaliacao",
                            "meta",
                            "google",
                            "whatsapp",
                            "instagram",
                            "messenger",
                            "telefone",
                            "presencial",
                            "recomendacao",
                            "agente_voz",
                            "outro"
                        ]
                    },
                    "origem_rotulo": {
                        "type": "string"
                    },
                    "procedimento": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "nome": {
                                "type": "string"
                            }
                        }
                    },
                    "proxima_acao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "proxima_acao_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "sla_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "sla_atrasado": {
                        "type": "boolean"
                    },
                    "decisao": {
                        "type": "string",
                        "enum": [
                            "por_decidir",
                            "confirmado",
                            "indeciso",
                            "recusado"
                        ]
                    },
                    "decisao_rotulo": {
                        "type": "string"
                    },
                    "motivo_indecisao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "valor": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "valor_em_risco": {
                        "type": "boolean"
                    },
                    "pontuacao": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 100
                    },
                    "proposta_parada": {
                        "type": "boolean"
                    },
                    "duplicado": {
                        "type": "boolean"
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "dias_na_fase": {
                        "type": "integer"
                    },
                    "motivo_perda": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "preco",
                            "prazo",
                            "concorrencia",
                            "nao_elegivel",
                            "sem_resposta",
                            "outro",
                            null
                        ]
                    },
                    "motivo_perda_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            },
            "CrmFunil": {
                "type": "object",
                "properties": {
                    "fases": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "chave": {
                                    "type": "string"
                                },
                                "tipo": {
                                    "type": "string",
                                    "enum": [
                                        "aberta",
                                        "ganha",
                                        "perdida"
                                    ]
                                },
                                "cor": {
                                    "type": "string"
                                },
                                "sla_horas": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "total": {
                                    "type": "integer"
                                },
                                "valor": {
                                    "type": [
                                        "number",
                                        "null"
                                    ]
                                },
                                "mais": {
                                    "type": "integer",
                                    "description": "Leads da fase além dos cartões devolvidos."
                                },
                                "cartoes": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/CrmCartaoFunil"
                                    }
                                }
                            }
                        }
                    },
                    "total": {
                        "type": "integer"
                    },
                    "kpis": {
                        "type": "object",
                        "properties": {
                            "abertos": {
                                "type": "integer"
                            },
                            "por_responder": {
                                "type": "integer"
                            },
                            "paradas": {
                                "type": "integer"
                            },
                            "ganhos_mes": {
                                "type": "integer"
                            },
                            "valor_aberto": {
                                "type": [
                                    "number",
                                    "null"
                                ]
                            }
                        }
                    },
                    "pode_valores": {
                        "type": "boolean"
                    },
                    "pode_editar": {
                        "type": "boolean"
                    },
                    "objetivos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "metrica": {
                                    "type": "string"
                                },
                                "rotulo": {
                                    "type": "string"
                                },
                                "quem": {
                                    "type": "string"
                                },
                                "alvo": {
                                    "type": "number"
                                },
                                "atual": {
                                    "type": "number"
                                },
                                "percentagem": {
                                    "type": "number",
                                    "x-unidade": "%"
                                },
                                "moeda": {
                                    "type": "boolean"
                                }
                            }
                        }
                    },
                    "motivos_perda": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "valor": {
                                    "type": "string"
                                },
                                "rotulo": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "filtros": {
                        "type": "object",
                        "description": "Opções {valor, rotulo} de cada filtro: responsavel_id, origem, procedimento_id, decisao, sla.",
                        "additionalProperties": {
                            "type": "array",
                            "items": {
                                "type": "object",
                                "properties": {
                                    "valor": {
                                        "type": "string"
                                    },
                                    "rotulo": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    },
                    "ativos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "nome": {
                                    "type": "string"
                                },
                                "campo": {
                                    "type": "string"
                                },
                                "rotulo": {
                                    "type": "string"
                                },
                                "valor": {
                                    "type": "string"
                                },
                                "valorParam": {
                                    "type": "string"
                                }
                            }
                        }
                    }
                }
            },
            "CrmLeadDetalhe": {
                "type": "object",
                "description": "Detalhe do lead: só dados comerciais e administrativos. A cronologia exclui a categoria clínica. A leitura é auditada.",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "email": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "telefone": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "tel": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "data_nascimento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "origem": {
                        "type": "string",
                        "enum": [
                            "site",
                            "pre_avaliacao",
                            "meta",
                            "google",
                            "whatsapp",
                            "instagram",
                            "messenger",
                            "telefone",
                            "presencial",
                            "recomendacao",
                            "agente_voz",
                            "outro"
                        ]
                    },
                    "origem_rotulo": {
                        "type": "string"
                    },
                    "campanha": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "utm": {
                        "type": "object",
                        "properties": {
                            "source": {
                                "type": "string"
                            },
                            "medium": {
                                "type": "string"
                            },
                            "campaign": {
                                "type": "string"
                            },
                            "term": {
                                "type": "string"
                            },
                            "content": {
                                "type": "string"
                            }
                        }
                    },
                    "procedimento": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "fase": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "nome": {
                                "type": "string"
                            },
                            "tipo": {
                                "type": "string"
                            },
                            "cor": {
                                "type": "string"
                            }
                        }
                    },
                    "responsavel": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "nome": {
                                "type": "string"
                            },
                            "cor": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    },
                    "pontuacao": {
                        "type": "integer"
                    },
                    "decisao": {
                        "type": "string",
                        "enum": [
                            "por_decidir",
                            "confirmado",
                            "indeciso",
                            "recusado"
                        ]
                    },
                    "decisao_rotulo": {
                        "type": "string"
                    },
                    "motivo_indecisao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "valor_estimado": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "motivo_perda": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "motivo_perda_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "proxima_acao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "proxima_acao_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "sla_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "sla_atrasado": {
                        "type": "boolean"
                    },
                    "primeira_resposta_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "ultimo_contacto_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "convertido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "recomendado_por": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "recompensa_estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "pendente",
                            "atribuida",
                            null
                        ]
                    },
                    "consentimento_contacto": {
                        "type": "boolean"
                    },
                    "marketing": {
                        "type": "object",
                        "properties": {
                            "decisao": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "valido": {
                                "type": "boolean"
                            },
                            "adesao_confirmada_em": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            }
                        }
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "conversas": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "chamadas": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "cronologia": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "duplicados": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/CrmDuplicado"
                        }
                    },
                    "fases": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "equipa": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "motivos_perda": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "decisoes": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "pode_editar": {
                        "type": "boolean"
                    },
                    "pode_valores": {
                        "type": "boolean"
                    },
                    "pode_converter": {
                        "type": "boolean"
                    }
                }
            },
            "CrmDuplicado": {
                "type": "object",
                "properties": {
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "lead",
                            "paciente"
                        ]
                    },
                    "id": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "motivos": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "telefone",
                                "email",
                                "nif",
                                "nome_data"
                            ]
                        }
                    },
                    "forte": {
                        "type": "boolean"
                    },
                    "convertido": {
                        "type": "boolean"
                    },
                    "perdido": {
                        "type": "boolean"
                    }
                }
            },
            "CrmConversaLinha": {
                "type": "object",
                "description": "Linha da caixa de entrada. Nas conversas de departamentos clínicos, «previa» só mostra o texto a quem vê a ficha clínica.",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "canal": {
                        "type": "string",
                        "enum": [
                            "portal",
                            "whatsapp",
                            "instagram",
                            "messenger",
                            "email",
                            "chat_site",
                            "sms"
                        ]
                    },
                    "canal_rotulo": {
                        "type": "string"
                    },
                    "contacto": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "pessoa": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "tipo": {
                                "type": "string",
                                "enum": [
                                    "paciente",
                                    "lead"
                                ]
                            },
                            "id": {
                                "type": "integer"
                            },
                            "nome": {
                                "type": "string"
                            }
                        }
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "aberta",
                            "pendente",
                            "resolvida"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "departamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "administracao",
                            "medico",
                            "enfermagem",
                            "tecnico",
                            "comercial",
                            "rececao",
                            null
                        ]
                    },
                    "departamento_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "atribuida_a": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "nome": {
                                "type": "string"
                            },
                            "cor": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    },
                    "ia_a_tratar": {
                        "type": "boolean"
                    },
                    "aguarda_resposta": {
                        "type": "boolean"
                    },
                    "sla_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "atrasada": {
                        "type": "boolean"
                    },
                    "ultima_mensagem_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "previa": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "assunto": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "avaliacao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "minimum": 1,
                        "maximum": 5
                    }
                }
            },
            "CrmMensagem": {
                "type": "object",
                "description": "Mensagem de uma conversa. «corpo» e «traducao» são nulos quando o conteúdo é reservado à equipa clínica.",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "direcao": {
                        "type": "string",
                        "enum": [
                            "entrada",
                            "saida",
                            "nota"
                        ]
                    },
                    "autor_tipo": {
                        "type": "string",
                        "enum": [
                            "contacto",
                            "equipa",
                            "agente",
                            "sistema"
                        ]
                    },
                    "autor": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "nome": {
                                "type": "string"
                            },
                            "cor": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    },
                    "canal": {
                        "type": "string"
                    },
                    "corpo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "traducao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "anexos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "ficheiro_id": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "tipo": {
                                    "type": "string"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "url": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "na_ficha": {
                                    "type": "boolean"
                                },
                                "visivel": {
                                    "type": "boolean"
                                }
                            }
                        }
                    },
                    "estado_entrega": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "enviada",
                            "entregue",
                            "lida",
                            "falhada",
                            null
                        ]
                    },
                    "estado_entrega_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "ia": {
                        "type": "boolean",
                        "description": "Escrita pelo assistente virtual."
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "CrmConversaDetalhe": {
                "allOf": [
                    {
                        "$ref": "#/components/schemas/CrmConversaLinha"
                    },
                    {
                        "type": "object",
                        "properties": {
                            "mensagens": {
                                "type": "array",
                                "items": {
                                    "$ref": "#/components/schemas/CrmMensagem"
                                }
                            },
                            "conteudo_visivel": {
                                "type": "boolean"
                            },
                            "outras_conversas": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "id": {
                                            "type": "integer"
                                        },
                                        "canal": {
                                            "type": "string"
                                        },
                                        "estado": {
                                            "type": "string"
                                        },
                                        "ultima_mensagem_em": {
                                            "type": [
                                                "string",
                                                "null"
                                            ],
                                            "format": "date-time"
                                        }
                                    }
                                }
                            },
                            "transferencias": {
                                "type": "array",
                                "items": {
                                    "type": "object"
                                }
                            },
                            "avaliacao_comentario": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "respostas_rapidas": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "id": {
                                            "type": "integer"
                                        },
                                        "titulo": {
                                            "type": "string"
                                        },
                                        "atalho": {
                                            "type": [
                                                "string",
                                                "null"
                                            ]
                                        },
                                        "corpo": {
                                            "type": "string"
                                        }
                                    }
                                }
                            },
                            "canais_reenvio": {
                                "type": "array",
                                "items": {
                                    "type": "string"
                                }
                            },
                            "ia": {
                                "type": "object",
                                "properties": {
                                    "traducao": {
                                        "type": "boolean"
                                    },
                                    "respostas": {
                                        "type": "boolean"
                                    }
                                }
                            },
                            "equipa": {
                                "type": "array",
                                "description": "Pessoas para atribuir (só para quem edita e sem depois_de).",
                                "items": {
                                    "type": [
                                        "object",
                                        "null"
                                    ],
                                    "properties": {
                                        "id": {
                                            "type": "integer"
                                        },
                                        "nome": {
                                            "type": "string"
                                        },
                                        "cor": {
                                            "type": [
                                                "string",
                                                "null"
                                            ]
                                        }
                                    }
                                }
                            },
                            "pode_editar": {
                                "type": "boolean"
                            }
                        }
                    }
                ]
            },
            "CrmListaChamadas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "reativacao",
                            "confirmacoes",
                            "propostas_paradas",
                            "pos_operatorio",
                            "leads_fase",
                            "lembretes"
                        ]
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "finalidade": {
                        "type": "string",
                        "enum": [
                            "servico",
                            "comercial"
                        ]
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "rascunho",
                            "ativa",
                            "pausada",
                            "concluida"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "total": {
                        "type": "integer"
                    },
                    "concluidos": {
                        "type": "integer"
                    },
                    "bloqueados": {
                        "type": "integer"
                    },
                    "guiao_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "executor": {
                        "type": "string",
                        "enum": [
                            "pessoa",
                            "agente"
                        ],
                        "description": "«agente»: a lista é chamada pelo agente de voz (sem «contacto seguinte»)."
                    },
                    "executor_rotulo": {
                        "type": "string"
                    },
                    "janela": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            },
            "CrmContactoMarcador": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "campanha_id": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "telefone": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "pendente",
                            "em_curso",
                            "concluido",
                            "bloqueado",
                            "reagendado"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "resultado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "marcou_consulta",
                            "interessado",
                            "ligar_mais_tarde",
                            "sem_interesse",
                            "nao_atendeu",
                            "numero_errado",
                            "pediu_nao_contactar",
                            "confirmou",
                            "remarcou",
                            "cancelou",
                            null
                        ]
                    },
                    "resultado_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "motivo_bloqueio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "sem_consentimento",
                            "suprimido",
                            null
                        ]
                    },
                    "tentativas": {
                        "type": "integer"
                    },
                    "proxima_tentativa_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "respostas": {
                        "type": "object"
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "finalidade": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "tel": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            },
            "CrmGuiao": {
                "type": [
                    "object",
                    "null"
                ],
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "tipo": {
                        "type": "string"
                    },
                    "finalidade": {
                        "type": "string"
                    },
                    "abertura": {
                        "type": "string",
                        "description": "Já com {colaborador} e {clinica} substituídos."
                    },
                    "passos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "titulo": {
                                    "type": "string"
                                },
                                "texto": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "campos_obrigatorios": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string"
                                },
                                "rotulo": {
                                    "type": "string"
                                },
                                "tipo": {
                                    "type": "string",
                                    "enum": [
                                        "texto",
                                        "escolha",
                                        "booleano",
                                        "data"
                                    ]
                                },
                                "opcoes": {
                                    "type": "array",
                                    "items": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                }
            },
            "CrmEstatisticasChamadas": {
                "type": "object",
                "properties": {
                    "de": {
                        "type": "string",
                        "format": "date"
                    },
                    "ate": {
                        "type": "string",
                        "format": "date"
                    },
                    "totais": {
                        "type": "object",
                        "properties": {
                            "atendidas": {
                                "type": "integer"
                            },
                            "perdidas": {
                                "type": "integer"
                            },
                            "fora_horas": {
                                "type": "integer"
                            },
                            "saida": {
                                "type": "integer"
                            },
                            "por_devolver": {
                                "type": "integer"
                            }
                        }
                    },
                    "por_pessoa": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "utilizador_id": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "cor": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "atendidas": {
                                    "type": "integer"
                                },
                                "perdidas": {
                                    "type": "integer"
                                },
                                "fora_horas": {
                                    "type": "integer"
                                },
                                "saida": {
                                    "type": "integer"
                                },
                                "devolver_min": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ],
                                    "x-unidade": "min"
                                }
                            }
                        }
                    },
                    "calor": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "x": {
                                    "type": "string"
                                },
                                "y": {
                                    "type": "number"
                                },
                                "serie": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                }
                            }
                        }
                    }
                }
            },
            "CrmPedidoAgente": {
                "type": "object",
                "description": "Pedido do agente de IA. No detalhe, «transcricao», «notas_relatadas», «sinais» e a gravação só seguem para quem vê a ficha clínica (conteudo_clinico = true).",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "canal": {
                        "type": "string",
                        "enum": [
                            "voz",
                            "whatsapp",
                            "chat"
                        ]
                    },
                    "canal_rotulo": {
                        "type": "string"
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "marcacao",
                            "informacao",
                            "pos_operatorio",
                            "pagamento",
                            "alarme",
                            "outro"
                        ]
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "ia_a_tratar",
                            "passado_equipa",
                            "resolvido",
                            "validado"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "pessoa": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "tipo": {
                                "type": "string"
                            },
                            "id": {
                                "type": "integer"
                            },
                            "nome": {
                                "type": "string"
                            }
                        }
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "telefone": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "intencao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "proximo_passo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "sinal_alarme": {
                        "type": "boolean"
                    },
                    "resumo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "resumo_reservado": {
                        "type": "boolean"
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "duracao_s": {
                        "type": "integer",
                        "x-unidade": "s"
                    },
                    "aviso_ia": {
                        "type": "boolean"
                    },
                    "identificacao_verificada": {
                        "type": "boolean"
                    },
                    "amostra": {
                        "type": "boolean"
                    },
                    "revisao_estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "conforme",
                            "a_corrigir",
                            null
                        ]
                    },
                    "conversa_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "marcacao_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "assumido_por": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "transcricao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "notas_relatadas": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "sinais": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "conteudo_clinico": {
                        "type": "boolean"
                    },
                    "marcacao_pedida": {
                        "type": "object"
                    },
                    "gravacao_url": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "revisao_nota": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "validado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "correcao_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "pode_validar": {
                        "type": "boolean"
                    },
                    "pode_editar": {
                        "type": "boolean"
                    },
                    "motor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "externo",
                            "proprio",
                            null
                        ],
                        "description": "Quem conduziu a chamada de voz: o fornecedor externo ou o motor próprio do AnagenSys."
                    },
                    "motor_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "servico_ia": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "local",
                            "externo",
                            "misto",
                            null
                        ],
                        "description": "Motor próprio: que serviço de IA foi usado (local, externo ou os dois)."
                    },
                    "servico_ia_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "sessao_voz": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/CrmSessaoVoz"
                            },
                            {
                                "type": "null"
                            }
                        ],
                        "description": "Só no detalhe e no motor próprio."
                    },
                    "turnos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/CrmTurnoVoz"
                        },
                        "description": "Só no detalhe e no motor próprio. O texto de cada fala só segue para quem vê a ficha clínica."
                    },
                    "direcao": {
                        "type": "string",
                        "enum": [
                            "entrada",
                            "saida"
                        ]
                    },
                    "direcao_rotulo": {
                        "type": "string"
                    },
                    "resumo_sem_dados_pessoais": {
                        "type": "boolean",
                        "description": "O «resumo» devolvido é a versão sem dados pessoais (quem não vê a ficha clínica)."
                    },
                    "transcricao_limpa": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Só no detalhe: versão sem dados pessoais (marcas [NOME], [TELEFONE]…); nula nos pedidos clínicos para quem não vê a ficha clínica."
                    },
                    "limpeza_estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "regras",
                            "ia",
                            "falhou",
                            null
                        ]
                    },
                    "limpeza_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "saida": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "description": "Só no detalhe: a lista do marcador de uma chamada feita pelo agente.",
                        "properties": {
                            "lista_id": {
                                "type": "integer"
                            },
                            "lista": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "tipo": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "tipo_rotulo": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "resultado": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "resultado_rotulo": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "tentativas": {
                                "type": "integer"
                            }
                        }
                    },
                    "turnos_sem_dados_pessoais": {
                        "type": "boolean"
                    }
                }
            },
            "CrmSessaoVoz": {
                "type": "object",
                "description": "Chamada atendida pelo motor de voz próprio.",
                "properties": {
                    "estado": {
                        "type": "string",
                        "enum": [
                            "ativa",
                            "transferida",
                            "terminada"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "lingua": {
                        "type": "string"
                    },
                    "turnos": {
                        "type": "integer"
                    },
                    "segundos_audio": {
                        "type": "integer",
                        "x-unidade": "s"
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "acao_final": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "continuar",
                            "transferir",
                            "terminar",
                            null
                        ]
                    },
                    "acao_final_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "motivo_fim": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "motivo_fim_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "gravacao_consentida": {
                        "type": "boolean"
                    }
                }
            },
            "CrmTurnoVoz": {
                "type": "object",
                "description": "Uma fala de quem liga («pessoa») ou uma resposta do agente («agente»; «sistema» para as frases fixas). O áudio das falas nunca é guardado.",
                "properties": {
                    "ordem": {
                        "type": "integer"
                    },
                    "papel": {
                        "type": "string",
                        "enum": [
                            "pessoa",
                            "agente",
                            "sistema"
                        ]
                    },
                    "papel_rotulo": {
                        "type": "string"
                    },
                    "texto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Nulo para quem não vê a ficha clínica."
                    },
                    "lingua": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "acao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "continuar",
                            "transferir",
                            "terminar",
                            null
                        ]
                    },
                    "acao_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "motivo_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "servicos": {
                        "type": "object",
                        "properties": {
                            "transcricao": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "enum": [
                                    "local",
                                    "externo",
                                    "ponte",
                                    null
                                ]
                            },
                            "resposta": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "enum": [
                                    "local",
                                    "externo",
                                    null
                                ]
                            },
                            "fala": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "enum": [
                                    "local",
                                    "externo",
                                    "ponte",
                                    null
                                ]
                            }
                        }
                    },
                    "servicos_rotulos": {
                        "type": "object"
                    },
                    "duracao_audio_ms": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "latencia_ms": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "CrmRespostaVoz": {
                "type": "object",
                "description": "Resposta do motor de voz à ponte telefónica. O texto vai sempre (a ponte pode usar a sua própria voz quando não há áudio).",
                "required": [
                    "sessao",
                    "texto",
                    "acao",
                    "lingua"
                ],
                "properties": {
                    "sessao": {
                        "type": "string",
                        "description": "O chamada_id da ponte."
                    },
                    "pedido_id": {
                        "type": "integer"
                    },
                    "turno": {
                        "type": "integer"
                    },
                    "lingua": {
                        "type": "string",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ]
                    },
                    "texto": {
                        "type": "string"
                    },
                    "audio": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "description": "Nulo quando audio_modo = nenhum ou a fala falhou. «base64» ou «url» (ligação assinada, 120 s, uso único) conforme o audio_modo.",
                        "properties": {
                            "formato": {
                                "type": "string",
                                "enum": [
                                    "wav",
                                    "mp3"
                                ]
                            },
                            "mime": {
                                "type": "string"
                            },
                            "duracao_ms": {
                                "type": [
                                    "integer",
                                    "null"
                                ]
                            },
                            "base64": {
                                "type": "string"
                            },
                            "url": {
                                "type": "string",
                                "format": "uri"
                            },
                            "expira_em": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            }
                        }
                    },
                    "acao": {
                        "type": "string",
                        "enum": [
                            "continuar",
                            "transferir",
                            "terminar",
                            "recolher",
                            "correio_voz"
                        ],
                        "description": "continuar: tocar e ouvir a fala seguinte; recolher (menu): tocar e esperar uma tecla ou uma fala curta (ver «recolher»); transferir: para «destino»; correio_voz: tocar e gravar a mensagem (ver «correio_voz») e enviá-la em /ganchos/voz/fim; terminar: tocar e desligar."
                    },
                    "destino": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "description": "Só com acao = transferir. A ponte usa «extensao» ou «numero»; sem nenhum, escolhe pelo departamento.",
                        "properties": {
                            "tipo": {
                                "type": "string",
                                "enum": [
                                    "departamento",
                                    "extensao",
                                    "gestor"
                                ]
                            },
                            "departamento": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "enum": [
                                    "rececao",
                                    "comercial",
                                    "enfermagem",
                                    "medico",
                                    "tecnico",
                                    "administracao",
                                    null
                                ]
                            },
                            "departamento_rotulo": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "numero": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "extensao": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "utilizador_id": {
                                "type": [
                                    "integer",
                                    "null"
                                ]
                            },
                            "utilizador_email": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "utilizador_nome": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    },
                    "servicos": {
                        "type": "object",
                        "properties": {
                            "transcricao": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "enum": [
                                    "local",
                                    "externo",
                                    "ponte",
                                    null
                                ]
                            },
                            "resposta": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "enum": [
                                    "local",
                                    "externo",
                                    null
                                ]
                            },
                            "fala": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "enum": [
                                    "local",
                                    "externo",
                                    "ponte",
                                    null
                                ]
                            }
                        }
                    },
                    "max_segundos_fala": {
                        "type": "integer",
                        "x-unidade": "s"
                    },
                    "inicio": {
                        "type": "boolean"
                    },
                    "repetido": {
                        "type": "boolean"
                    },
                    "modo": {
                        "type": "string",
                        "enum": [
                            "agente",
                            "menu",
                            "saida"
                        ]
                    },
                    "recolher": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "description": "Só com acao = recolher.",
                        "properties": {
                            "teclas": {
                                "type": "array",
                                "items": {
                                    "type": "string",
                                    "enum": [
                                        "0",
                                        "1",
                                        "2",
                                        "3",
                                        "4",
                                        "5",
                                        "6",
                                        "7",
                                        "8",
                                        "9",
                                        "*",
                                        "#"
                                    ]
                                }
                            },
                            "voz": {
                                "type": "boolean",
                                "description": "Há opções por voz: enviar também a fala."
                            },
                            "max_digitos": {
                                "type": "integer"
                            },
                            "espera_s": {
                                "type": "integer",
                                "x-unidade": "s"
                            },
                            "max_segundos_fala": {
                                "type": "integer",
                                "x-unidade": "s"
                            }
                        }
                    },
                    "correio_voz": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "description": "Só com acao = correio_voz.",
                        "properties": {
                            "max_segundos": {
                                "type": "integer",
                                "x-unidade": "s"
                            },
                            "departamento": {
                                "type": "string",
                                "enum": [
                                    "rececao",
                                    "comercial",
                                    "enfermagem",
                                    "medico",
                                    "tecnico",
                                    "administracao"
                                ]
                            }
                        }
                    },
                    "identificacao": {
                        "type": "string",
                        "enum": [
                            "nao",
                            "codigo_enviado",
                            "verificada",
                            "falhou"
                        ],
                        "description": "Identificação por código SMS ao número registado: até «verificada», o agente só dá informação geral."
                    }
                }
            },
            "CrmConsumoAgente": {
                "type": "object",
                "properties": {
                    "mes": {
                        "type": "string",
                        "pattern": "^\\d{4}-\\d{2}$"
                    },
                    "minutos": {
                        "type": "number",
                        "x-unidade": "min"
                    },
                    "chamadas": {
                        "type": "integer"
                    },
                    "conversas": {
                        "type": "integer"
                    },
                    "limite_minutos": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "limite_conversas": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "pct_minutos": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "%"
                    },
                    "pct_conversas": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "%"
                    },
                    "alerta": {
                        "type": "boolean"
                    }
                }
            },
            "MktBloco": {
                "type": "object",
                "required": [
                    "tipo"
                ],
                "description": "Bloco do editor. «texto» aceita HTML simples (sanitizado); «botao» só aceita https://, mailto: ou tel:; «imagem» tem de vir da biblioteca com consentimento válido para o canal.",
                "properties": {
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "titulo",
                            "texto",
                            "imagem",
                            "botao",
                            "divisoria"
                        ]
                    },
                    "texto": {
                        "type": "string"
                    },
                    "html": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string"
                    },
                    "imagem_id": {
                        "type": "integer"
                    },
                    "legenda": {
                        "type": "string"
                    }
                }
            },
            "MktCampanha": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "canal": {
                        "type": "string",
                        "enum": [
                            "email",
                            "sms",
                            "whatsapp"
                        ]
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "informacao",
                            "novidade",
                            "evento",
                            "avaliacao",
                            "reativacao"
                        ]
                    },
                    "finalidade": {
                        "type": "string",
                        "enum": [
                            "marketing",
                            "servico"
                        ]
                    },
                    "segmento_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "assunto": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "pre_cabecalho": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "conteudo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Texto simples (SMS e WhatsApp)."
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "rascunho",
                            "em_aprovacao",
                            "aprovada",
                            "agendada",
                            "a_enviar",
                            "enviada",
                            "cancelada"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "aprovado_por": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "aprovado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "aprovacao_nota": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "aprovacao_pedida_por": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "agendada_para": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "enviada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "total": {
                        "type": "integer"
                    },
                    "entregues": {
                        "type": "integer"
                    },
                    "cliques": {
                        "type": "integer"
                    },
                    "anulacoes": {
                        "type": "integer"
                    },
                    "conversoes": {
                        "type": "integer"
                    },
                    "editavel": {
                        "type": "boolean"
                    }
                }
            },
            "MktEditorCampanha": {
                "type": "object",
                "properties": {
                    "campanha": {
                        "$ref": "#/components/schemas/MktCampanha"
                    },
                    "blocos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/MktBloco"
                        }
                    },
                    "imagens": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "titulo": {
                                    "type": "string"
                                },
                                "url": {
                                    "type": "string"
                                },
                                "canais": {
                                    "type": "array",
                                    "items": {
                                        "type": "string"
                                    }
                                },
                                "valido_ate": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                }
                            }
                        }
                    },
                    "segmentos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "contagem": {
                                    "type": "integer"
                                },
                                "usa_dados_clinicos": {
                                    "type": "boolean"
                                }
                            }
                        }
                    },
                    "avisos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "tom": {
                                    "type": "string",
                                    "enum": [
                                        "info",
                                        "aviso",
                                        "perigo"
                                    ]
                                },
                                "texto": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "rodape": {
                        "type": "object",
                        "description": "Identificação legal da clínica no rodapé (nome, número de contribuinte, registo na entidade reguladora, licença, morada)."
                    },
                    "permissoes": {
                        "type": "object",
                        "properties": {
                            "editar": {
                                "type": "boolean"
                            },
                            "aprovar": {
                                "type": "boolean"
                            }
                        }
                    }
                }
            },
            "MktResultados": {
                "type": "object",
                "properties": {
                    "de": {
                        "type": "string",
                        "format": "date"
                    },
                    "ate": {
                        "type": "string",
                        "format": "date"
                    },
                    "linhas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "plataforma": {
                                    "type": "string",
                                    "enum": [
                                        "meta",
                                        "google",
                                        "tiktok",
                                        "linkedin",
                                        "outra"
                                    ]
                                },
                                "plataforma_rotulo": {
                                    "type": "string"
                                },
                                "campanha": {
                                    "type": "string"
                                },
                                "custo": {
                                    "type": "number",
                                    "x-unidade": "EUR"
                                },
                                "impressoes": {
                                    "type": "integer"
                                },
                                "cliques": {
                                    "type": "integer"
                                },
                                "leads_plataforma": {
                                    "type": "integer"
                                },
                                "leads": {
                                    "type": "integer"
                                },
                                "consultas": {
                                    "type": "integer"
                                },
                                "cirurgias": {
                                    "type": "integer"
                                },
                                "custo_por_lead": {
                                    "type": [
                                        "number",
                                        "null"
                                    ],
                                    "x-unidade": "EUR"
                                },
                                "custo_por_consulta": {
                                    "type": [
                                        "number",
                                        "null"
                                    ],
                                    "x-unidade": "EUR"
                                },
                                "custo_por_cirurgia": {
                                    "type": [
                                        "number",
                                        "null"
                                    ],
                                    "x-unidade": "EUR"
                                }
                            }
                        }
                    },
                    "totais": {
                        "type": "object"
                    },
                    "leads_por_origem": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "x": {
                                    "type": "string"
                                },
                                "y": {
                                    "type": "number"
                                },
                                "serie": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                }
                            }
                        }
                    },
                    "custo_por_dia": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "x": {
                                    "type": "string"
                                },
                                "y": {
                                    "type": "number"
                                },
                                "serie": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                }
                            }
                        }
                    }
                }
            },
            "CrmTemposFases": {
                "type": "object",
                "description": "Tempo em cada fase do funil: média das passagens terminadas no período (segundos), leads ainda na fase e matriz por responsável. Âmbito do módulo crm.leads aplicado.",
                "properties": {
                    "de": {
                        "type": "string",
                        "format": "date"
                    },
                    "ate": {
                        "type": "string",
                        "format": "date"
                    },
                    "funil_id": {
                        "type": "integer"
                    },
                    "fases": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "chave": {
                                    "type": "string"
                                },
                                "cor": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "tipo": {
                                    "type": "string"
                                },
                                "sla_horas": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "passagens": {
                                    "type": "integer"
                                },
                                "media_segundos": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "maximo_segundos": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "acima_do_alvo": {
                                    "type": "boolean"
                                },
                                "em_curso": {
                                    "type": "integer"
                                },
                                "em_curso_media_segundos": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                }
                            }
                        }
                    },
                    "pessoas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "cor": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "passagens": {
                                    "type": "integer"
                                },
                                "media_segundos": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "fases": {
                                    "type": "array",
                                    "items": {
                                        "type": "object",
                                        "properties": {
                                            "fase_id": {
                                                "type": "integer"
                                            },
                                            "passagens": {
                                                "type": "integer"
                                            },
                                            "media_segundos": {
                                                "type": "integer"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "total": {
                        "type": "object",
                        "properties": {
                            "passagens": {
                                "type": "integer"
                            },
                            "media_segundos": {
                                "type": [
                                    "integer",
                                    "null"
                                ]
                            },
                            "ciclo_medio_segundos": {
                                "type": [
                                    "integer",
                                    "null"
                                ]
                            }
                        }
                    }
                }
            },
            "MktCartaoIntegracao": {
                "type": "object",
                "properties": {
                    "chave": {
                        "type": "string",
                        "enum": [
                            "meta_leads",
                            "google_leads",
                            "meta_mensagens",
                            "whatsapp_linhas",
                            "conversoes_meta",
                            "conversoes_google",
                            "custos_meta",
                            "custos_google",
                            "publicos",
                            "datas_especiais",
                            "sinc_email",
                            "aberturas"
                        ]
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "descricao": {
                        "type": "string"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "ok",
                            "pronto",
                            "por_configurar",
                            "erro",
                            "desligado"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "falta": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "definicoes": {
                        "type": "string"
                    },
                    "ultimo_ok_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "ultimo_erro": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "ultimo_erro_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "contagem": {
                        "type": "integer"
                    },
                    "acoes": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    }
                }
            },
            "MktIntegracoes": {
                "type": "object",
                "description": "Painel «Canais e integrações». Sem dados pessoais nem chaves.",
                "properties": {
                    "cartoes": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/MktCartaoIntegracao"
                        }
                    },
                    "enderecos": {
                        "type": "object",
                        "properties": {
                            "meta": {
                                "type": "string"
                            },
                            "google_leads": {
                                "type": "string"
                            }
                        }
                    },
                    "linhas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "departamento": {
                                    "type": "string"
                                },
                                "numero": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "principal": {
                                    "type": "boolean"
                                }
                            }
                        }
                    },
                    "leads_recentes": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "plataforma": {
                                    "type": "string"
                                },
                                "plataforma_rotulo": {
                                    "type": "string"
                                },
                                "estado": {
                                    "type": "string"
                                },
                                "estado_rotulo": {
                                    "type": "string"
                                },
                                "erro": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "campanha": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "anuncio": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "teste": {
                                    "type": "boolean"
                                },
                                "tentativas": {
                                    "type": "integer"
                                },
                                "lead_id": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "recebido_em": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "format": "date-time"
                                }
                            }
                        }
                    },
                    "conversoes": {
                        "type": "object",
                        "properties": {
                            "pendentes": {
                                "type": "integer"
                            },
                            "enviadas": {
                                "type": "integer"
                            },
                            "bloqueadas": {
                                "type": "integer"
                            },
                            "falhadas": {
                                "type": "integer"
                            },
                            "recentes": {
                                "type": "array",
                                "items": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "publicos": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "datas": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "pode_editar": {
                        "type": "boolean"
                    },
                    "pode_definicoes": {
                        "type": "boolean"
                    },
                    "acoes": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    }
                }
            },
            "CrmMenuVozArvore": {
                "type": "object",
                "description": "Árvore do menu: até 40 passos; cada passo diz uma mensagem (falada ou gravada, por língua) e oferece até 12 opções por tecla e/ou palavras.",
                "properties": {
                    "inicio": {
                        "type": "string"
                    },
                    "nos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "string",
                                    "pattern": "^[a-z0-9_]{1,40}$"
                                },
                                "titulo": {
                                    "type": "string"
                                },
                                "mensagem": {
                                    "type": "object",
                                    "properties": {
                                        "modo": {
                                            "type": "string",
                                            "enum": [
                                                "falada",
                                                "gravada"
                                            ]
                                        },
                                        "textos": {
                                            "type": "object"
                                        },
                                        "gravacoes": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "opcoes": {
                                    "type": "array",
                                    "items": {
                                        "type": "object",
                                        "properties": {
                                            "tecla": {
                                                "type": "string"
                                            },
                                            "palavras": {
                                                "type": "array",
                                                "items": {
                                                    "type": "string"
                                                }
                                            },
                                            "rotulo": {
                                                "type": "string"
                                            },
                                            "destino": {
                                                "type": "object"
                                            }
                                        }
                                    }
                                },
                                "sem_resposta": {
                                    "type": [
                                        "object",
                                        "null"
                                    ]
                                },
                                "tentativas": {
                                    "type": "integer",
                                    "minimum": 1,
                                    "maximum": 5
                                },
                                "espera_s": {
                                    "type": "integer",
                                    "minimum": 3,
                                    "maximum": 20
                                }
                            }
                        }
                    }
                }
            },
            "CrmMenuVozEditor": {
                "type": "object",
                "properties": {
                    "menu": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "nome": {
                                "type": "string"
                            },
                            "descricao": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "ativo": {
                                "type": "boolean"
                            },
                            "predefinido": {
                                "type": "boolean"
                            },
                            "lingua": {
                                "type": "string",
                                "enum": [
                                    "pt-PT",
                                    "pt-BR",
                                    "en",
                                    "es",
                                    "fr",
                                    "de"
                                ]
                            },
                            "usar_horario_clinica": {
                                "type": "boolean"
                            },
                            "horario": {
                                "type": "object",
                                "description": "{\"1\": [[\"09:00\",\"13:00\"], …], …, \"7\": []} (1 = segunda)."
                            },
                            "feriados": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "string",
                                            "format": "date"
                                        },
                                        "nome": {
                                            "type": "string"
                                        }
                                    }
                                }
                            },
                            "fora_horas": {
                                "type": "object"
                            },
                            "feriado": {
                                "type": "object"
                            },
                            "reconhecido": {
                                "type": "string",
                                "enum": [
                                    "menu",
                                    "gestor",
                                    "agente"
                                ]
                            },
                            "aviso_gravacao": {
                                "type": "boolean"
                            },
                            "versao": {
                                "type": "integer"
                            },
                            "publicado_em": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            },
                            "atualizado_em": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            }
                        }
                    },
                    "arvore": {
                        "$ref": "#/components/schemas/CrmMenuVozArvore"
                    },
                    "avisos": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "momento": {
                        "type": "string",
                        "enum": [
                            "aberto",
                            "fora_horas",
                            "feriado"
                        ]
                    },
                    "momento_rotulo": {
                        "type": "string"
                    },
                    "numeros": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "numero": {
                                    "type": "string"
                                },
                                "nome": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "opcoes": {
                        "type": "object",
                        "properties": {
                            "destinos": {
                                "type": "array",
                                "items": {
                                    "type": "object"
                                }
                            },
                            "departamentos": {
                                "type": "array",
                                "items": {
                                    "type": "object"
                                }
                            },
                            "linguas": {
                                "type": "array",
                                "items": {
                                    "type": "object"
                                }
                            },
                            "reconhecido": {
                                "type": "array",
                                "items": {
                                    "type": "object"
                                }
                            },
                            "teclas": {
                                "type": "array",
                                "items": {
                                    "type": "string"
                                }
                            },
                            "gravacoes": {
                                "type": "array",
                                "items": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "pode_editar": {
                        "type": "boolean"
                    }
                }
            },
            "CrmVozesLinguas": {
                "type": "object",
                "properties": {
                    "variante_pt": {
                        "type": "string",
                        "enum": [
                            "pt-PT",
                            "acompanhar"
                        ]
                    },
                    "lingua_omissao": {
                        "type": "string"
                    },
                    "ouvir_pronto": {
                        "type": "boolean"
                    },
                    "pt_pt_ok": {
                        "type": "boolean"
                    },
                    "linguas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "lingua": {
                                    "type": "string",
                                    "enum": [
                                        "pt-PT",
                                        "pt-BR",
                                        "en",
                                        "es",
                                        "fr",
                                        "de"
                                    ]
                                },
                                "rotulo": {
                                    "type": "string"
                                },
                                "ativa": {
                                    "type": "boolean"
                                },
                                "ouvir": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "enum": [
                                        "local",
                                        "externo",
                                        null
                                    ]
                                },
                                "falar": {
                                    "type": "string",
                                    "enum": [
                                        "local",
                                        "externo",
                                        "ponte"
                                    ]
                                },
                                "falar_rotulo": {
                                    "type": "string"
                                },
                                "voz": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "voz_exata": {
                                    "type": "boolean"
                                },
                                "avisos": {
                                    "type": "array",
                                    "items": {
                                        "type": "string",
                                        "enum": [
                                            "sem_voz",
                                            "voz_de_outra_variante",
                                            "voz_brasileira",
                                            "voz_europeia",
                                            "variante_por_confirmar",
                                            "local_sem_pt_pt",
                                            "local_pt_generico",
                                            "fala_da_central"
                                        ]
                                    }
                                },
                                "avisos_rotulos": {
                                    "type": "array",
                                    "items": {
                                        "type": "string"
                                    }
                                },
                                "ultimo_teste": {
                                    "type": [
                                        "object",
                                        "null"
                                    ]
                                }
                            }
                        }
                    }
                }
            },
            "CrmExecucaoTestes": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "pendente",
                            "a_correr",
                            "concluida",
                            "falhou"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "total": {
                        "type": "integer"
                    },
                    "feitos": {
                        "type": "integer"
                    },
                    "passaram": {
                        "type": "integer"
                    },
                    "falharam": {
                        "type": "integer"
                    },
                    "regrediram": {
                        "type": "integer"
                    },
                    "melhoraram": {
                        "type": "integer"
                    },
                    "artigos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "titulo": {
                                    "type": "string"
                                },
                                "versao_testada": {
                                    "type": "integer"
                                },
                                "versao": {
                                    "type": "integer"
                                },
                                "estado": {
                                    "type": "string"
                                },
                                "clinico": {
                                    "type": "boolean"
                                }
                            }
                        }
                    },
                    "regras": {
                        "type": "object",
                        "properties": {
                            "temas_proibidos": {
                                "type": "array",
                                "items": {
                                    "type": "string"
                                }
                            },
                            "alarmes": {
                                "type": "array",
                                "items": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "decisao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "aprovada",
                            "rejeitada",
                            null
                        ]
                    },
                    "decisao_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "decidido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "nota": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "publicado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "concluida_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "pode_decidir": {
                        "type": "boolean"
                    },
                    "resultados": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "description": "Só no detalhe; primeiro o que regrediu. Sem dados pessoais (as conversas de teste são limpas).",
                            "properties": {
                                "teste_id": {
                                    "type": "integer"
                                },
                                "titulo": {
                                    "type": "string"
                                },
                                "canal": {
                                    "type": "string",
                                    "enum": [
                                        "voz",
                                        "escrito"
                                    ]
                                },
                                "pergunta": {
                                    "type": "string"
                                },
                                "resposta_atual": {
                                    "type": "string"
                                },
                                "resposta_nova": {
                                    "type": "string"
                                },
                                "passou_atual": {
                                    "type": "boolean"
                                },
                                "passou_nova": {
                                    "type": "boolean"
                                },
                                "falhas_atual_rotulos": {
                                    "type": "array",
                                    "items": {
                                        "type": "string"
                                    }
                                },
                                "falhas_nova_rotulos": {
                                    "type": "array",
                                    "items": {
                                        "type": "string"
                                    }
                                },
                                "regrediu": {
                                    "type": "boolean"
                                },
                                "melhorou": {
                                    "type": "boolean"
                                },
                                "diferente": {
                                    "type": "boolean"
                                },
                                "semelhanca": {
                                    "type": "integer",
                                    "x-unidade": "%"
                                }
                            }
                        }
                    }
                }
            },
            "CrmChamadaAoVivo": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "direcao": {
                        "type": "string",
                        "enum": [
                            "entrada",
                            "saida"
                        ]
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "a_tocar",
                            "em_curso"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "numero": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "numero_clinica": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "numero_campanha": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "extensao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "pessoa": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "tipo": {
                                "type": "string",
                                "enum": [
                                    "paciente",
                                    "lead"
                                ]
                            },
                            "id": {
                                "type": "integer"
                            },
                            "nome": {
                                "type": "string"
                            }
                        }
                    },
                    "responsavel": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "nome": {
                                "type": "string"
                            },
                            "cor": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    },
                    "atendente": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "nome": {
                                "type": "string"
                            },
                            "cor": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    },
                    "tarefas_abertas": {
                        "type": "integer"
                    },
                    "ultimo_contacto": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "inicio": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            },
                            "direcao": {
                                "type": "string"
                            },
                            "estado_rotulo": {
                                "type": "string"
                            }
                        }
                    },
                    "pelo_agente": {
                        "type": "boolean"
                    }
                }
            },
            "Bloco": {
                "type": "object",
                "required": [
                    "tipo"
                ],
                "description": "Bloco do formato único (§18.1): kpis, lista, campos, grafico, galeria, cronologia, alerta, jornada, acoes. Ligação L = {web, app}.",
                "properties": {
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "kpis",
                            "lista",
                            "campos",
                            "grafico",
                            "galeria",
                            "cronologia",
                            "alerta",
                            "jornada",
                            "acoes"
                        ]
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "itens": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "grafico": {
                        "type": "string",
                        "enum": [
                            "linha",
                            "area",
                            "barras",
                            "barras-h",
                            "donut",
                            "funil",
                            "calor",
                            "dispersao"
                        ]
                    },
                    "valores": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "x": {
                                    "type": "string"
                                },
                                "y": {
                                    "type": "number"
                                },
                                "serie": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "rotulo": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                }
                            }
                        }
                    },
                    "unidade": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "tom": {
                        "type": "string",
                        "enum": [
                            "marca",
                            "ouro",
                            "sucesso",
                            "aviso",
                            "perigo",
                            "info",
                            "neutro",
                            "dadora"
                        ]
                    },
                    "texto": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "etapa": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 9
                    },
                    "ligacao": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "web": {
                                "type": "string"
                            },
                            "app": {
                                "type": "string"
                            }
                        }
                    }
                }
            },
            "CartaoPainel": {
                "type": "object",
                "properties": {
                    "chave": {
                        "type": "string"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "icone": {
                        "type": "string"
                    },
                    "ordem": {
                        "type": "integer"
                    },
                    "largura": {
                        "type": "integer",
                        "enum": [
                            1,
                            2,
                            3
                        ]
                    },
                    "oculto": {
                        "type": "boolean"
                    },
                    "erro": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "blocos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/Bloco"
                        }
                    }
                }
            },
            "PreferenciasPainel": {
                "type": "object",
                "properties": {
                    "ordem": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "ocultos": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "larguras": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 3
                        }
                    },
                    "periodo": {
                        "type": "string",
                        "enum": [
                            "hoje",
                            "semana",
                            "mes",
                            "30d",
                            "trimestre",
                            "ano"
                        ]
                    }
                }
            },
            "Painel": {
                "type": "object",
                "properties": {
                    "periodo": {
                        "type": "object",
                        "properties": {
                            "chave": {
                                "type": "string"
                            },
                            "de": {
                                "type": "string",
                                "format": "date"
                            },
                            "ate": {
                                "type": "string",
                                "format": "date"
                            },
                            "rotulo": {
                                "type": "string"
                            }
                        }
                    },
                    "saudacao": {
                        "type": "string"
                    },
                    "preferencias": {
                        "$ref": "#/components/schemas/PreferenciasPainel"
                    },
                    "periodos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string"
                                },
                                "rotulo": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "blocos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/CartaoPainel"
                        }
                    }
                }
            },
            "ItemChecklist": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "texto": {
                        "type": "string"
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "responsavel_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "obrigatorio": {
                        "type": "boolean"
                    },
                    "feito": {
                        "type": "boolean"
                    },
                    "feito_por_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "feito_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "ordem": {
                        "type": "integer"
                    }
                }
            },
            "Tarefa": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "tipo": {
                        "type": "string"
                    },
                    "prioridade": {
                        "type": "string",
                        "enum": [
                            "baixa",
                            "normal",
                            "alta",
                            "urgente"
                        ]
                    },
                    "prioridade_rotulo": {
                        "type": "string"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "aberta",
                            "em_curso",
                            "concluida",
                            "cancelada"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "origem": {
                        "type": "string",
                        "enum": [
                            "manual",
                            "automatica",
                            "mensagem",
                            "agente"
                        ]
                    },
                    "origem_rotulo": {
                        "type": "string"
                    },
                    "ref_tipo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "ref_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "prazo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "em_atraso": {
                        "type": "boolean"
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "responsavel_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "departamento": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "departamento_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "paciente_nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "x-anagen-permissao": "ficha.identificacao"
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "lead_nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "x-anagen-permissao": "crm.leads"
                    },
                    "cirurgia_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "cirurgia_numero": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "x-anagen-permissao": "bloco.mapa"
                    },
                    "checklist": {
                        "type": "object",
                        "properties": {
                            "total": {
                                "type": "integer"
                            },
                            "feitos": {
                                "type": "integer"
                            }
                        }
                    },
                    "itens": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/ItemChecklist"
                        }
                    },
                    "concluida_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "NovaTarefa": {
                "type": "object",
                "required": [
                    "titulo"
                ],
                "properties": {
                    "titulo": {
                        "type": "string",
                        "maxLength": 255,
                        "description": "Aceita !prioridade, hoje/amanhã e @Nome."
                    },
                    "descricao": {
                        "type": "string",
                        "maxLength": 5000
                    },
                    "prazo": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "prioridade": {
                        "type": "string",
                        "enum": [
                            "baixa",
                            "normal",
                            "alta",
                            "urgente"
                        ]
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "departamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "administracao",
                            "medico",
                            "enfermagem",
                            "tecnico",
                            "comercial",
                            "rececao",
                            null
                        ]
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "cirurgia_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "itens": {
                        "type": "array",
                        "maxItems": 50,
                        "items": {
                            "type": "string",
                            "maxLength": 255
                        },
                        "description": "Itens iniciais da checklist."
                    }
                }
            },
            "AlterarTarefa": {
                "type": "object",
                "properties": {
                    "titulo": {
                        "type": "string",
                        "maxLength": 255
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "prazo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "prioridade": {
                        "type": "string",
                        "enum": [
                            "baixa",
                            "normal",
                            "alta",
                            "urgente"
                        ]
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "aberta",
                            "em_curso",
                            "cancelada"
                        ]
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "departamento": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "cirurgia_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    }
                }
            },
            "ListaTarefas": {
                "type": "object",
                "properties": {
                    "vista": {
                        "type": "string"
                    },
                    "grupos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string"
                                },
                                "titulo": {
                                    "type": "string"
                                },
                                "tom": {
                                    "type": "string"
                                },
                                "tarefas": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/Tarefa"
                                    }
                                }
                            }
                        }
                    },
                    "total": {
                        "type": "integer"
                    },
                    "contagens": {
                        "type": "object",
                        "properties": {
                            "hoje": {
                                "type": "integer"
                            },
                            "atraso": {
                                "type": "integer"
                            },
                            "abertas": {
                                "type": "integer"
                            },
                            "equipa": {
                                "type": "integer"
                            }
                        }
                    }
                }
            },
            "Canal": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "privado",
                            "grupo",
                            "departamento",
                            "paciente",
                            "cirurgia"
                        ]
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "departamento": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "cirurgia_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "arquivado": {
                        "type": "boolean"
                    },
                    "silenciado": {
                        "type": "boolean"
                    },
                    "convidado_externo": {
                        "type": "boolean"
                    },
                    "gestor": {
                        "type": "boolean"
                    },
                    "nao_lidas": {
                        "type": "integer"
                    },
                    "mencoes": {
                        "type": "integer"
                    },
                    "ultima": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "texto": {
                                "type": "string"
                            },
                            "autor_nome": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "em": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            }
                        }
                    },
                    "ultima_mensagem_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "CanalDetalhe": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "tipo": {
                        "type": "string"
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "arquivado": {
                        "type": "boolean"
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "cirurgia_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "ligacao": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "web": {
                                "type": "string"
                            },
                            "app": {
                                "type": "string"
                            }
                        }
                    },
                    "gestor": {
                        "type": "boolean"
                    },
                    "silenciado": {
                        "type": "boolean"
                    },
                    "pode_escrever": {
                        "type": "boolean"
                    },
                    "atualizar_segundos": {
                        "type": "integer"
                    },
                    "membros": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "cor": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "foto_ficheiro_id": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "perfil": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "papel": {
                                    "type": "string",
                                    "enum": [
                                        "membro",
                                        "gestor"
                                    ]
                                },
                                "ultimo_lido_id": {
                                    "type": "integer"
                                },
                                "lido_em": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "format": "date-time"
                                },
                                "convidado_externo": {
                                    "type": "boolean"
                                }
                            }
                        }
                    }
                }
            },
            "NovoCanal": {
                "type": "object",
                "required": [
                    "tipo"
                ],
                "properties": {
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "grupo",
                            "paciente",
                            "cirurgia",
                            "departamento"
                        ]
                    },
                    "nome": {
                        "type": "string",
                        "maxLength": 120
                    },
                    "descricao": {
                        "type": "string",
                        "maxLength": 500
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "cirurgia_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "departamento": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "membros": {
                        "type": "array",
                        "items": {
                            "type": "integer"
                        }
                    }
                }
            },
            "Mensagem": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "canal_id": {
                        "type": "integer"
                    },
                    "autor_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "autor_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "autor_cor": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "minha": {
                        "type": "boolean"
                    },
                    "sistema": {
                        "type": "boolean"
                    },
                    "corpo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "apagada": {
                        "type": "boolean"
                    },
                    "editada": {
                        "type": "boolean"
                    },
                    "mencoes": {
                        "type": "array",
                        "items": {
                            "type": "integer"
                        }
                    },
                    "mencionado": {
                        "type": "boolean"
                    },
                    "anexos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "mime": {
                                    "type": "string"
                                },
                                "tamanho": {
                                    "type": "integer",
                                    "x-unidade": "bytes"
                                },
                                "tipo": {
                                    "type": "string"
                                },
                                "url": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "description": "Ligação assinada (30 min)."
                                }
                            }
                        }
                    },
                    "tarefa_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "responde_a_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "lido_por": {
                        "type": "integer"
                    },
                    "lido_por_todos": {
                        "type": "boolean"
                    },
                    "pode_editar": {
                        "type": "boolean"
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "MensagensDoCanal": {
                "type": "object",
                "properties": {
                    "mensagens": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/Mensagem"
                        }
                    },
                    "leituras": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "integer"
                        },
                        "description": "Utilizador → último id lido."
                    },
                    "ha_mais": {
                        "type": "boolean"
                    }
                }
            },
            "Comunicado": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "corpo": {
                        "type": "string",
                        "description": "HTML sanitizado."
                    },
                    "resumo": {
                        "type": "string"
                    },
                    "publico": {
                        "type": "string",
                        "enum": [
                            "todos",
                            "departamento",
                            "perfil"
                        ]
                    },
                    "publico_rotulo": {
                        "type": "string"
                    },
                    "destino": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "destino_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "importancia": {
                        "type": "string",
                        "enum": [
                            "normal",
                            "alta"
                        ]
                    },
                    "exige_leitura": {
                        "type": "boolean"
                    },
                    "fixado": {
                        "type": "boolean"
                    },
                    "publicado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "expira_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "lido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "por_ler": {
                        "type": "boolean"
                    },
                    "estatisticas": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "lidos": {
                                "type": "integer"
                            },
                            "total": {
                                "type": "integer"
                            }
                        }
                    }
                }
            },
            "GruposDeIndicadores": {
                "type": "object",
                "properties": {
                    "grupos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string"
                                },
                                "titulo": {
                                    "type": "string"
                                },
                                "icone": {
                                    "type": "string"
                                },
                                "modulo": {
                                    "type": "string"
                                },
                                "exportar": {
                                    "type": "boolean"
                                },
                                "indicadores": {
                                    "type": "array",
                                    "items": {
                                        "type": "object",
                                        "properties": {
                                            "chave": {
                                                "type": "string"
                                            },
                                            "titulo": {
                                                "type": "string"
                                            },
                                            "descricao": {
                                                "type": "string"
                                            },
                                            "icone": {
                                                "type": "string"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "filtros": {
                        "type": "object"
                    },
                    "consolidar": {
                        "type": "boolean"
                    }
                }
            },
            "ResultadoIndicadores": {
                "type": "object",
                "properties": {
                    "grupo": {
                        "type": "string"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "filtros": {
                        "type": "object",
                        "properties": {
                            "periodo": {
                                "type": "string"
                            },
                            "de": {
                                "type": "string"
                            },
                            "ate": {
                                "type": "string"
                            },
                            "ant_de": {
                                "type": "string"
                            },
                            "ant_ate": {
                                "type": "string"
                            },
                            "medico_id": {
                                "type": [
                                    "integer",
                                    "null"
                                ]
                            },
                            "comercial_id": {
                                "type": [
                                    "integer",
                                    "null"
                                ]
                            },
                            "origem": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "procedimento_id": {
                                "type": [
                                    "integer",
                                    "null"
                                ]
                            },
                            "todas": {
                                "type": "boolean"
                            }
                        }
                    },
                    "ativos": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "indicadores": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string"
                                },
                                "grupo": {
                                    "type": "string"
                                },
                                "titulo": {
                                    "type": "string"
                                },
                                "descricao": {
                                    "type": "string"
                                },
                                "icone": {
                                    "type": "string"
                                },
                                "disponivel": {
                                    "type": "boolean"
                                },
                                "falta": {
                                    "type": "array",
                                    "items": {
                                        "type": "string"
                                    }
                                },
                                "blocos": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/Bloco"
                                    }
                                }
                            }
                        }
                    }
                }
            },
            "TokenBi": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "prefixo": {
                        "type": "string"
                    },
                    "conjuntos": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "ultimo_uso_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "usos": {
                        "type": "integer"
                    },
                    "expira_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "revogado": {
                        "type": "boolean"
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "Exportacao": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "pedido",
                            "a_gerar",
                            "concluida",
                            "erro",
                            "expirada"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "pedido_por_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "tamanho": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "x-unidade": "bytes"
                    },
                    "tabelas": {
                        "type": "integer"
                    },
                    "sha256": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "erro": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "concluida_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "expira_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "descarregar": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Ligação assinada (15 min, exige sessão web)."
                    }
                }
            },
            "ConsumoIntegracoes": {
                "type": "object",
                "properties": {
                    "dias": {
                        "type": "integer"
                    },
                    "fonte": {
                        "type": "string",
                        "enum": [
                            "atividade",
                            "tokens"
                        ]
                    },
                    "clientes": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "client_id": {
                                    "type": "string"
                                },
                                "ativo": {
                                    "type": "boolean"
                                },
                                "limite_minuto": {
                                    "type": "integer"
                                },
                                "ultimo_uso_em": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "format": "date-time"
                                },
                                "pedidos": {
                                    "type": "integer"
                                },
                                "erros": {
                                    "type": "integer"
                                },
                                "tokens": {
                                    "type": "integer"
                                },
                                "ms_medio": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ],
                                    "x-unidade": "ms"
                                }
                            }
                        }
                    },
                    "blocos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/Bloco"
                        }
                    }
                }
            },
            "SessaoReuniao": {
                "type": "object",
                "description": "Estado de uma reunião gravada (sem o texto da transcrição).",
                "properties": {
                    "reuniao": {
                        "type": "object"
                    },
                    "participantes": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "presencas": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "meu_consentimento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "dado",
                            "recusado",
                            "retirado",
                            null
                        ]
                    },
                    "gravacao": {
                        "type": "object"
                    },
                    "transcricao": {
                        "type": "object"
                    },
                    "resumo": {
                        "type": "object"
                    },
                    "acoes": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "assistente": {
                        "type": "object"
                    },
                    "permissoes": {
                        "type": "object"
                    }
                }
            },
            "CursoAcademia": {
                "type": "object",
                "properties": {
                    "curso": {
                        "type": "object"
                    },
                    "licoes": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "progresso": {
                        "type": "object"
                    },
                    "teste": {
                        "type": "object",
                        "properties": {
                            "perguntas": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "id": {
                                            "type": "integer"
                                        },
                                        "enunciado": {
                                            "type": "string"
                                        },
                                        "tipo": {
                                            "type": "string",
                                            "enum": [
                                                "unica",
                                                "multipla",
                                                "verdadeiro_falso"
                                            ]
                                        },
                                        "opcoes": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "indice": {
                                                        "type": "integer"
                                                    },
                                                    "texto": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            },
                            "disponivel": {
                                "type": "boolean"
                            },
                            "falta_licoes": {
                                "type": "boolean"
                            },
                            "tentativas": {
                                "type": "array",
                                "items": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "certificado": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "gerir": {
                        "type": "boolean"
                    }
                }
            },
            "Incorporacao3d": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "modelo3d_id": {
                        "type": "integer"
                    },
                    "url": {
                        "type": "string",
                        "format": "uri",
                        "description": "Só na criação."
                    },
                    "codigo_incorporacao": {
                        "type": "string",
                        "description": "Iframe pronto a colar. Só na criação."
                    },
                    "origens": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "referencia": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "expira_em": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "ativa",
                            "expirada",
                            "revogada"
                        ]
                    },
                    "vistas": {
                        "type": "integer"
                    },
                    "ultimo_acesso_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "minutos": {
                        "type": "integer"
                    },
                    "sem_rosto": {
                        "type": "boolean"
                    }
                }
            },
            "Licenca": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "chave": {
                        "type": "string"
                    },
                    "chave_mascarada": {
                        "type": "string"
                    },
                    "clinica": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "nome": {
                                "type": "string"
                            },
                            "codigo": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "localidade": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "logotipo_url": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "cor_marca": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "ativa": {
                                "type": "boolean"
                            }
                        }
                    },
                    "plano": {
                        "type": "string",
                        "enum": [
                            "essencial",
                            "clinica",
                            "grupo",
                            "personalizado"
                        ]
                    },
                    "plano_rotulo": {
                        "type": "string"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "teste",
                            "ativa",
                            "suspensa",
                            "expirada",
                            "cancelada"
                        ]
                    },
                    "estado_efetivo": {
                        "type": "string",
                        "enum": [
                            "teste",
                            "ativa",
                            "graca",
                            "expirada",
                            "suspensa",
                            "cancelada"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "tom": {
                        "type": "string"
                    },
                    "so_leitura": {
                        "type": "boolean"
                    },
                    "bloqueada": {
                        "type": "boolean"
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "dias_restantes": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "dias_graca": {
                        "type": "integer"
                    },
                    "dias_graca_restantes": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "renovacao_automatica": {
                        "type": "boolean"
                    },
                    "modulos": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "modulos_total": {
                        "type": "integer"
                    },
                    "limites": {
                        "type": "object",
                        "properties": {
                            "utilizadores": {
                                "type": [
                                    "integer",
                                    "null"
                                ]
                            },
                            "armazenamento_gb": {
                                "type": [
                                    "number",
                                    "null"
                                ],
                                "x-unidade": "GB"
                            },
                            "locais": {
                                "type": [
                                    "integer",
                                    "null"
                                ]
                            }
                        }
                    },
                    "uso": {
                        "type": "object",
                        "properties": {
                            "utilizadores": {
                                "type": "integer"
                            },
                            "armazenamento_bytes": {
                                "type": "integer"
                            },
                            "armazenamento_gb": {
                                "type": "number",
                                "x-unidade": "GB"
                            },
                            "locais": {
                                "type": "integer"
                            }
                        }
                    },
                    "percentagens": {
                        "type": "object"
                    },
                    "preco": {
                        "type": "number"
                    },
                    "periodicidade": {
                        "type": "string"
                    },
                    "moeda": {
                        "type": "string"
                    },
                    "mrr": {
                        "type": "number"
                    },
                    "faturacao": {
                        "type": "object"
                    },
                    "responsavel": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "administrador": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "suspensa_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "motivo_suspensao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "cancelada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "dominios": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/Dominio"
                        }
                    },
                    "eventos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/EventoLicenca"
                        }
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "atualizado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "EventoLicenca": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "tipo": {
                        "type": "string"
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "tom": {
                        "type": "string"
                    },
                    "ator_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "resumo": {
                        "type": "string"
                    },
                    "antes": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "depois": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "Dominio": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "clinica_id": {
                        "type": "integer"
                    },
                    "dominio": {
                        "type": "string"
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "site",
                            "portal",
                            "ambos"
                        ]
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "principal": {
                        "type": "boolean"
                    },
                    "subdominio": {
                        "type": "boolean"
                    },
                    "verificado": {
                        "type": "boolean"
                    },
                    "verificado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "registo_dns": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "tipo": {
                                "type": "string"
                            },
                            "nome": {
                                "type": "string"
                            },
                            "valor": {
                                "type": "string"
                            }
                        }
                    }
                }
            },
            "ResumoLicencas": {
                "type": "object",
                "properties": {
                    "kpis": {
                        "type": "object"
                    },
                    "por_estado": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "por_plano": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "mrr_por_mes": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "a_expirar": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/Licenca"
                        }
                    },
                    "sem_licenca": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    }
                }
            },
            "PedidoNovaLicenca": {
                "type": "object",
                "required": [
                    "marca",
                    "licenca",
                    "administrador"
                ],
                "properties": {
                    "clinica_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "clinica": {
                        "type": "object"
                    },
                    "marca": {
                        "type": "object"
                    },
                    "licenca": {
                        "type": "object"
                    },
                    "administrador": {
                        "type": "object",
                        "properties": {
                            "nome": {
                                "type": "string"
                            },
                            "email": {
                                "type": "string"
                            }
                        }
                    }
                }
            },
            "PreparacaoModulo": {
                "type": "object",
                "properties": {
                    "modulo": {
                        "type": "string"
                    },
                    "ordem": {
                        "type": "integer"
                    },
                    "ok": {
                        "type": "boolean"
                    },
                    "criados": {
                        "type": "integer"
                    },
                    "mensagens": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "erro": {
                        "type": "string"
                    }
                }
            },
            "ResultadoNovaLicenca": {
                "type": "object",
                "properties": {
                    "licenca": {
                        "$ref": "#/components/schemas/Licenca"
                    },
                    "clinica": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "nome": {
                                "type": "string"
                            },
                            "codigo": {
                                "type": "string"
                            }
                        }
                    },
                    "preparacao": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/PreparacaoModulo"
                        }
                    },
                    "administrador": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "email": {
                                "type": "string"
                            },
                            "convite_enviado": {
                                "type": "boolean"
                            }
                        }
                    }
                }
            },
            "MinhaLicenca": {
                "type": "object",
                "properties": {
                    "clinica": {
                        "type": "object"
                    },
                    "plataforma": {
                        "type": "boolean"
                    },
                    "licenca": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "modulos": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "uso": {
                        "type": "object"
                    },
                    "contacto": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "eventos": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    }
                }
            },
            "EstadoLicenca": {
                "type": "object",
                "properties": {
                    "estado": {
                        "type": "string",
                        "enum": [
                            "teste",
                            "ativa",
                            "graca",
                            "expirada",
                            "suspensa",
                            "cancelada",
                            "sem_licenca",
                            "plataforma"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "tom": {
                        "type": "string"
                    },
                    "so_leitura": {
                        "type": "boolean"
                    },
                    "bloqueada": {
                        "type": "boolean"
                    },
                    "fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "dias_restantes": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "dias_graca": {
                        "type": "integer"
                    },
                    "dias_graca_restantes": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "aviso": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "tom": {
                                "type": "string"
                            },
                            "titulo": {
                                "type": "string"
                            },
                            "texto": {
                                "type": "string"
                            }
                        }
                    }
                }
            },
            "Superadmin": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "email": {
                        "type": "string"
                    },
                    "telefone": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "idioma": {
                        "type": "string"
                    },
                    "clinica": {
                        "type": "object"
                    },
                    "perfil": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "so_plataforma": {
                        "type": "boolean"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "ativo",
                            "suspenso",
                            "convidado",
                            "bloqueado"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "tom": {
                        "type": "string"
                    },
                    "segundo_fator": {
                        "type": "boolean"
                    },
                    "ultimo_acesso_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "sessoes_ativas": {
                        "type": "integer"
                    },
                    "superadmin_desde": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "eu": {
                        "type": "boolean"
                    },
                    "pode": {
                        "type": "object"
                    },
                    "historico": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    }
                }
            },
            "ClinicaPublica": {
                "type": "object",
                "properties": {
                    "codigo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "nome": {
                        "type": "string"
                    },
                    "localidade": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "logotipo_url": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "cor_marca": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "disponivel": {
                        "type": "boolean"
                    },
                    "mensagem": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            },
            "ResultadoEmailTeste": {
                "type": "object",
                "properties": {
                    "ok": {
                        "type": "boolean"
                    },
                    "categoria": {
                        "type": "string",
                        "enum": [
                            "ok",
                            "incompleto",
                            "ligacao",
                            "autenticacao",
                            "cifra",
                            "remetente",
                            "tempo",
                            "outro"
                        ]
                    },
                    "mensagem": {
                        "type": "string"
                    },
                    "servidor": {
                        "type": "string"
                    },
                    "porta": {
                        "type": "integer"
                    },
                    "cifra": {
                        "type": "string"
                    },
                    "remetente": {
                        "type": "string"
                    },
                    "utilizador": {
                        "type": "string"
                    }
                }
            },
            "AmbienteExecucao": {
                "type": "object",
                "properties": {
                    "ambiente": {
                        "type": "string",
                        "enum": [
                            "producao",
                            "testes",
                            "desenvolvimento"
                        ]
                    },
                    "producao": {
                        "type": "boolean"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "texto": {
                        "type": "string"
                    },
                    "tom": {
                        "type": "string"
                    },
                    "canais": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "canal": {
                                    "type": "string"
                                },
                                "rotulo": {
                                    "type": "string"
                                },
                                "permitido": {
                                    "type": "boolean"
                                }
                            }
                        }
                    },
                    "canais_permitidos": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "destinos_restritos": {
                        "type": "boolean"
                    },
                    "dados": {
                        "type": "object",
                        "properties": {
                            "tipo": {
                                "type": "string",
                                "enum": [
                                    "producao",
                                    "sinteticos",
                                    "anonimizados",
                                    "desconhecida"
                                ]
                            },
                            "rotulo": {
                                "type": "string"
                            },
                            "em": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "aviso": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    }
                }
            },
            "EstadoPlataforma": {
                "type": "object",
                "properties": {
                    "gerado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "semaforo": {
                        "type": "object",
                        "properties": {
                            "tom": {
                                "type": "string",
                                "enum": [
                                    "sucesso",
                                    "aviso",
                                    "perigo"
                                ]
                            },
                            "titulo": {
                                "type": "string"
                            },
                            "texto": {
                                "type": "string"
                            }
                        }
                    },
                    "pontos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string"
                                },
                                "tom": {
                                    "type": "string"
                                },
                                "titulo": {
                                    "type": "string"
                                },
                                "texto": {
                                    "type": "string"
                                },
                                "seccao": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "ambiente": {
                        "$ref": "#/components/schemas/AmbienteExecucao"
                    },
                    "copias": {
                        "type": "object",
                        "description": "ativo, hora, proxima_em, ultima, ultima_tentativa, horas_desde, atraso, atraso_horas, por_tipo, retencao, espaco_local(_legivel), falhadas_30d, sem_destino_7d, pendente, serie [{x, dia, y (MB), serie, estado}], recentes, metodo_dump, destino {tipo, rotulo, configurado, imutavel, disponivel, retido}"
                    },
                    "restauros": {
                        "type": "object",
                        "description": "configurado, intervalo_dias, ultimo, ultimo_ok, dias_desde, atraso, pendente, recentes"
                    },
                    "vulnerabilidades": {
                        "type": "object",
                        "description": "abertas, por_gravidade, fora_prazo, lista, prazos, intrusao {ultimo, meses, atraso}, exercicio {ultimo, atraso}, atividades"
                    },
                    "dependencias": {
                        "type": "object",
                        "description": "servidor e app: {em, dias_desde, pacotes, vulneraveis, desatualizados, atraso} ou null; inventario_servidor; composer"
                    },
                    "alojamento": {
                        "type": "object",
                        "description": "principal, copias, subcontratantes [{papel, rotulo, nome, pais, pais_rotulo, cidade, classe (ue|adequacao|adequacao_condicional|fora|por_declarar), tom, finalidade, dados, ativo, nota}], tudo_ue, alojamento_ue, avisos, ia {ativos, com_dados, usos}"
                    },
                    "security_txt": {
                        "type": "object",
                        "properties": {
                            "ativo": {
                                "type": "boolean"
                            },
                            "url": {
                                "type": "string"
                            },
                            "contactos": {
                                "type": "integer"
                            },
                            "expira_em": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date"
                            },
                            "dias": {
                                "type": "integer"
                            },
                            "declarada": {
                                "type": "boolean"
                            },
                            "problemas": {
                                "type": "array",
                                "items": {
                                    "type": "string"
                                }
                            },
                            "tom": {
                                "type": "string"
                            }
                        }
                    },
                    "versao": {
                        "type": "object",
                        "properties": {
                            "plataforma": {
                                "type": "string"
                            },
                            "execucao": {
                                "type": "string"
                            },
                            "base_dados": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "cifra": {
                                "type": "object",
                                "properties": {
                                    "geral": {
                                        "type": "boolean"
                                    },
                                    "clinico": {
                                        "type": "boolean"
                                    },
                                    "distintas": {
                                        "type": "boolean"
                                    }
                                }
                            },
                            "capacidades": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "chave": {
                                            "type": "string"
                                        },
                                        "ok": {
                                            "type": "boolean"
                                        },
                                        "rotulo": {
                                            "type": "string"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "opcoes": {
                        "type": "object",
                        "description": "Listas {valor, rotulo}: gravidades, estados, origens, superficies, tipos, resultados."
                    }
                }
            },
            "CopiaSeguranca": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "origem": {
                        "type": "string",
                        "enum": [
                            "automatica",
                            "pedido",
                            "comando"
                        ]
                    },
                    "origem_rotulo": {
                        "type": "string"
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "diaria",
                            "semanal",
                            "mensal",
                            "manual"
                        ]
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "pedida",
                            "em_curso",
                            "ok",
                            "erro"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "estado_tom": {
                        "type": "string"
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "pedida_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "iniciada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "terminada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "duracao_ms": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "duracao_legivel": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "tamanho": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "tamanho_legivel": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "tamanho_conteudo": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "sha256": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^[0-9a-f]{64}$"
                    },
                    "sha256_conteudo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "metodo_dump": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "binario",
                            "php",
                            null
                        ]
                    },
                    "metodo_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "base_dados": {
                        "type": "object",
                        "properties": {
                            "tabelas": {
                                "type": "integer"
                            },
                            "linhas": {
                                "type": "integer"
                            },
                            "bytes": {
                                "type": "integer"
                            }
                        }
                    },
                    "ficheiros": {
                        "type": "object",
                        "properties": {
                            "total": {
                                "type": "integer"
                            },
                            "bytes": {
                                "type": "integer"
                            },
                            "bytes_legiveis": {
                                "type": "string"
                            }
                        }
                    },
                    "local": {
                        "type": "boolean"
                    },
                    "local_removida_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "verificada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "verificacao_estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "ok",
                            "falhou",
                            null
                        ]
                    },
                    "verificacao_tom": {
                        "type": "string"
                    },
                    "verificacao_detalhe": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "verificacao_pedida": {
                        "type": "boolean"
                    },
                    "destino_tipo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "destino_rotulo": {
                        "type": "string"
                    },
                    "destino_estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "nao_aplicavel",
                            "por_enviar",
                            "enviada",
                            "falhou",
                            "retida",
                            null
                        ]
                    },
                    "destino_estado_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "destino_tom": {
                        "type": "string"
                    },
                    "destino_enviada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "destino_detalhe": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "destino_tentativas": {
                        "type": "integer"
                    },
                    "imutavel": {
                        "type": "boolean"
                    },
                    "retencao_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "restauro_testado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "restauro_estado": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "erro": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "ligacao": {
                        "type": "object",
                        "properties": {
                            "web": {
                                "type": "string"
                            },
                            "app": {
                                "type": "string"
                            }
                        }
                    }
                }
            },
            "TesteRestauro": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "copia_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "teste",
                            "restauro"
                        ]
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "origem": {
                        "type": "string"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "pedido",
                            "em_curso",
                            "ok",
                            "parcial",
                            "erro"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "estado_tom": {
                        "type": "string"
                    },
                    "esquema": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "metodo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "pedido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "iniciado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "terminado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "duracao_legivel": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "tabelas_esperadas": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "tabelas_restauradas": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "linhas_esperadas": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "linhas_restauradas": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "ficheiros_verificados": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "ficheiros_falhados": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "falhas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "tabela": {
                                    "type": "string"
                                },
                                "esperadas": {
                                    "type": "integer"
                                },
                                "restauradas": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                }
                            }
                        }
                    },
                    "toleradas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "tabela": {
                                    "type": "string"
                                },
                                "esperadas": {
                                    "type": "integer"
                                },
                                "restauradas": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                }
                            }
                        }
                    },
                    "detalhe": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "erro": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            },
            "Vulnerabilidade": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "origem": {
                        "type": "string",
                        "enum": [
                            "composer_audit",
                            "pub_outdated",
                            "teste_intrusao",
                            "divulgacao",
                            "revisao_interna",
                            "asvs",
                            "outro"
                        ]
                    },
                    "origem_rotulo": {
                        "type": "string"
                    },
                    "superficie": {
                        "type": "string",
                        "enum": [
                            "servidor",
                            "app",
                            "infraestrutura",
                            "processo"
                        ]
                    },
                    "superficie_rotulo": {
                        "type": "string"
                    },
                    "referencia": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "componente": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "versao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "gravidade": {
                        "type": "string",
                        "enum": [
                            "critica",
                            "alta",
                            "media",
                            "baixa",
                            "info"
                        ]
                    },
                    "gravidade_rotulo": {
                        "type": "string"
                    },
                    "gravidade_tom": {
                        "type": "string"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "detetada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "prazo_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "dias_para_prazo": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "fora_prazo": {
                        "type": "boolean"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "aberta",
                            "em_correcao",
                            "corrigida",
                            "aceite",
                            "falso_positivo"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "estado_tom": {
                        "type": "string"
                    },
                    "resolvida_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "atividade_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "automatica": {
                        "type": "boolean"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Só no detalhe (guardada cifrada)."
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Só no detalhe (guardadas cifradas)."
                    }
                }
            },
            "AtividadeOperacao": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "teste_intrusao",
                            "exercicio_continuidade",
                            "teste_restauro_manual",
                            "revisao_dependencias",
                            "revisao_asvs",
                            "revisao_acessos",
                            "outro"
                        ]
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "realizada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "entidade": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "ambito": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "resultado": {
                        "type": "string",
                        "enum": [
                            "sem_constatacoes",
                            "com_constatacoes",
                            "parcial",
                            "falhou",
                            "concluido"
                        ]
                    },
                    "resultado_rotulo": {
                        "type": "string"
                    },
                    "resultado_tom": {
                        "type": "string"
                    },
                    "resumo": {
                        "type": "object"
                    },
                    "rpo_minutos": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "rto_minutos": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "proxima_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "em_atraso": {
                        "type": "boolean"
                    }
                }
            },
            "PerfilParceiro": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "medico",
                            "clinica",
                            "outro"
                        ]
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "organizacao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "email": {
                        "type": "string"
                    },
                    "telefone": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "cedula": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "desde": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "EncaminhamentoParceiro": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "codigo": {
                        "type": "string"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "contacto": {
                        "type": "object"
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "recebido",
                            "em_contacto",
                            "avaliacao",
                            "concluido",
                            "sem_seguimento"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "autorizado": {
                        "type": "boolean",
                        "description": "O paciente autorizou partilhar a evolução."
                    },
                    "recompensa": {
                        "type": "object",
                        "properties": {
                            "aplicavel": {
                                "type": "boolean"
                            },
                            "estado": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "enum": [
                                    "pendente",
                                    "atribuida",
                                    null
                                ]
                            },
                            "rotulo": {
                                "type": "string"
                            }
                        }
                    }
                }
            },
            "ValorComUnidade": {
                "type": "object",
                "required": [
                    "valor",
                    "unidade"
                ],
                "properties": {
                    "valor": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "unidade": {
                        "type": "string",
                        "enum": [
                            "UF/cm²",
                            "cabelos/cm²",
                            "enxertos",
                            "cm²",
                            "mm",
                            "mm²",
                            "cm",
                            "%",
                            "cabelos/UF",
                            "UF",
                            "cabelos",
                            "sessões",
                            "meses",
                            "anos",
                            "horas",
                            "mg/kg",
                            "—",
                            "pontos",
                            "campos",
                            "graus"
                        ]
                    }
                }
            },
            "NumeroMotor": {
                "type": "object",
                "description": "Número do motor com unidade, intervalo, fórmula, passo a passo, parâmetros e fonte.",
                "properties": {
                    "valor": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "unidade": {
                        "type": "string"
                    },
                    "min": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "max": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "formula": {
                        "type": "string"
                    },
                    "passos": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "fonte": {
                        "type": "string"
                    },
                    "parametros": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "valor": {
                                    "type": [
                                        "number",
                                        "null"
                                    ]
                                },
                                "unidade": {
                                    "type": "string"
                                },
                                "referencia": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "fonte": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                }
                            }
                        }
                    }
                },
                "example": {
                    "valor": 5625,
                    "unidade": "enxertos",
                    "min": 5344,
                    "max": 5907,
                    "formula": "N = Σ G × (1 + margem)",
                    "passos": [
                        "Linha frontal: 15 cm² × 25 UF/cm² = 375 enxertos",
                        "…",
                        "Soma das zonas: 5 625 enxertos"
                    ],
                    "parametros": [
                        {
                            "chave": "margem",
                            "nome": "Margem",
                            "valor": 0,
                            "unidade": "%",
                            "referencia": null,
                            "fonte": "sem fonte primária"
                        }
                    ],
                    "fonte": "Análise de referências e funcionalidades, secção 5 (27/10/2026)"
                }
            },
            "Aviso": {
                "type": "object",
                "properties": {
                    "codigo": {
                        "type": "string"
                    },
                    "nivel": {
                        "type": "string",
                        "enum": [
                            "info",
                            "aviso",
                            "bloqueio"
                        ]
                    },
                    "texto": {
                        "type": "string"
                    },
                    "campo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            },
            "EntradaCalculo": {
                "type": "object",
                "properties": {
                    "plano": {
                        "type": "object",
                        "properties": {
                            "cenario": {
                                "type": "string",
                                "enum": [
                                    "conservador",
                                    "provavel",
                                    "agressivo"
                                ]
                            },
                            "margem_pct": {
                                "type": "number"
                            },
                            "area_erro_pct": {
                                "type": [
                                    "number",
                                    "null"
                                ]
                            },
                            "escala": {
                                "type": "string"
                            },
                            "grau": {
                                "type": "string"
                            },
                            "precise_pontuacao": {
                                "type": [
                                    "number",
                                    "null"
                                ]
                            },
                            "tecnica": {
                                "type": "string"
                            },
                            "captura_id": {
                                "type": [
                                    "integer",
                                    "null"
                                ]
                            },
                            "modelo3d_id": {
                                "type": [
                                    "integer",
                                    "null"
                                ]
                            },
                            "notas": {
                                "type": "string"
                            }
                        }
                    },
                    "zonas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "required": [
                                "zona"
                            ],
                            "properties": {
                                "zona": {
                                    "type": "string",
                                    "enum": [
                                        "linha_frontal",
                                        "tufo_central",
                                        "frontal",
                                        "tempora_esq",
                                        "tempora_dir",
                                        "media",
                                        "coroa",
                                        "barba",
                                        "sobrancelha",
                                        "outra"
                                    ]
                                },
                                "area_cm2": {
                                    "oneOf": [
                                        {
                                            "type": "number"
                                        },
                                        {
                                            "$ref": "#/components/schemas/ValorComUnidade"
                                        }
                                    ],
                                    "x-unidade": "cm²"
                                },
                                "densidade_alvo": {
                                    "oneOf": [
                                        {
                                            "type": "number"
                                        },
                                        {
                                            "$ref": "#/components/schemas/ValorComUnidade"
                                        }
                                    ],
                                    "x-unidade": "UF/cm²"
                                },
                                "area_erro_pct": {
                                    "type": [
                                        "number",
                                        "null"
                                    ]
                                },
                                "origem_area": {
                                    "type": "string",
                                    "enum": [
                                        "manual",
                                        "modelo3d",
                                        "diagrama"
                                    ]
                                },
                                "justificacao": {
                                    "type": "string"
                                },
                                "incluida": {
                                    "type": "boolean"
                                },
                                "fase": {
                                    "type": "integer",
                                    "enum": [
                                        1,
                                        2
                                    ]
                                }
                            }
                        }
                    },
                    "dadoras": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "required": [
                                "subzona"
                            ],
                            "properties": {
                                "subzona": {
                                    "type": "string",
                                    "enum": [
                                        "occipital",
                                        "parietal_esq",
                                        "parietal_dir",
                                        "barba",
                                        "corpo"
                                    ]
                                },
                                "area_cm2": {
                                    "type": "number",
                                    "x-unidade": "cm²"
                                },
                                "densidade_uf_cm2": {
                                    "type": "number",
                                    "x-unidade": "UF/cm²"
                                },
                                "cabelos_por_uf": {
                                    "type": "number",
                                    "x-unidade": "cabelos/UF"
                                },
                                "calibre_mm": {
                                    "type": "number",
                                    "x-unidade": "mm"
                                },
                                "extraidos_anteriores": {
                                    "type": "integer",
                                    "x-unidade": "enxertos"
                                },
                                "sobrevivencia_pct": {
                                    "type": "number",
                                    "x-unidade": "%"
                                },
                                "amostras": {
                                    "type": "integer"
                                },
                                "desvio": {
                                    "type": "number"
                                }
                            }
                        }
                    },
                    "gravar": {
                        "type": "boolean"
                    }
                }
            },
            "ResultadoMotor": {
                "type": "object",
                "properties": {
                    "bloqueado": {
                        "type": "boolean"
                    },
                    "motivos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/Aviso"
                        }
                    },
                    "cenario": {
                        "type": "string"
                    },
                    "numeros": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "necessidade": {
                                "$ref": "#/components/schemas/NumeroMotor"
                            },
                            "residual_minima": {
                                "$ref": "#/components/schemas/NumeroMotor"
                            },
                            "capacidade_vida": {
                                "$ref": "#/components/schemas/NumeroMotor"
                            },
                            "capacidade_sessao": {
                                "$ref": "#/components/schemas/NumeroMotor"
                            },
                            "alternativas": {
                                "$ref": "#/components/schemas/NumeroMotor"
                            },
                            "sessoes": {
                                "$ref": "#/components/schemas/NumeroMotor"
                            },
                            "balanco": {
                                "$ref": "#/components/schemas/NumeroMotor"
                            },
                            "enxertos_viaveis": {
                                "$ref": "#/components/schemas/ValorComUnidade"
                            },
                            "extraidos": {
                                "$ref": "#/components/schemas/ValorComUnidade"
                            },
                            "capacidade_bruta": {
                                "$ref": "#/components/schemas/ValorComUnidade"
                            }
                        }
                    },
                    "zonas": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "dadoras": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "alternativas": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "plano_sessoes": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "verificacoes": {
                        "type": "object",
                        "properties": {
                            "precise": {
                                "type": [
                                    "object",
                                    "null"
                                ]
                            },
                            "norwood": {
                                "type": [
                                    "object",
                                    "null"
                                ]
                            }
                        }
                    },
                    "propostas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "codigo": {
                                    "type": "string"
                                },
                                "ordem": {
                                    "type": "integer"
                                },
                                "titulo": {
                                    "type": "string"
                                },
                                "descricao": {
                                    "type": "string"
                                },
                                "efeito": {
                                    "$ref": "#/components/schemas/ValorComUnidade"
                                },
                                "balanco_depois": {
                                    "$ref": "#/components/schemas/ValorComUnidade"
                                },
                                "cobre": {
                                    "type": "boolean"
                                },
                                "disponivel": {
                                    "type": "boolean"
                                },
                                "razao": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "alteracoes": {
                                    "type": "array",
                                    "items": {
                                        "type": "object"
                                    }
                                }
                            }
                        }
                    },
                    "avisos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/Aviso"
                        }
                    },
                    "cenarios": {
                        "type": "object"
                    },
                    "motor": {
                        "type": "object"
                    },
                    "valor": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "calculado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "impressao_digital": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                },
                "example": {
                    "bloqueado": false,
                    "motivos": [],
                    "cenario": "provavel",
                    "numeros": {
                        "necessidade": {
                            "valor": 5625,
                            "unidade": "enxertos",
                            "min": 5344,
                            "max": 5907,
                            "formula": "N = Σ G × (1 + margem)",
                            "passos": [
                                "Linha frontal: 15 cm² × 25 UF/cm² = 375 enxertos",
                                "…",
                                "Soma das zonas: 5 625 enxertos"
                            ],
                            "parametros": [
                                {
                                    "chave": "margem",
                                    "nome": "Margem",
                                    "valor": 0,
                                    "unidade": "%",
                                    "referencia": null,
                                    "fonte": "sem fonte primária"
                                }
                            ],
                            "fonte": "Análise de referências e funcionalidades, secção 5 (27/10/2026)"
                        },
                        "residual_minima": {
                            "valor": 50,
                            "unidade": "UF/cm²",
                            "criterio": "cabelos"
                        },
                        "capacidade_vida": {
                            "valor": 4750,
                            "unidade": "enxertos",
                            "min": 4512,
                            "max": 4987
                        },
                        "capacidade_sessao": {
                            "valor": 2850,
                            "unidade": "enxertos"
                        },
                        "sessoes": {
                            "valor": 2,
                            "unidade": "sessões"
                        },
                        "balanco": {
                            "valor": -875,
                            "unidade": "enxertos",
                            "min": -1395,
                            "max": -357
                        }
                    },
                    "plano_sessoes": [
                        {
                            "sessao": 1,
                            "enxertos": {
                                "valor": 2850,
                                "unidade": "enxertos"
                            },
                            "densidade_antes": {
                                "valor": 75,
                                "unidade": "UF/cm²"
                            },
                            "densidade_depois": {
                                "valor": 60,
                                "unidade": "UF/cm²"
                            }
                        },
                        {
                            "sessao": 2,
                            "enxertos": {
                                "valor": 1900,
                                "unidade": "enxertos"
                            },
                            "densidade_antes": {
                                "valor": 60,
                                "unidade": "UF/cm²"
                            },
                            "densidade_depois": {
                                "valor": 50,
                                "unidade": "UF/cm²"
                            }
                        }
                    ],
                    "propostas": [
                        {
                            "codigo": "baixar_coroa",
                            "ordem": 1,
                            "efeito": {
                                "valor": 350,
                                "unidade": "enxertos"
                            },
                            "balanco_depois": {
                                "valor": -525,
                                "unidade": "enxertos"
                            },
                            "disponivel": true
                        }
                    ],
                    "avisos": [
                        {
                            "codigo": "limite_dador",
                            "nivel": "aviso",
                            "texto": "Défice de 875 enxertos face à capacidade dadora.",
                            "campo": null
                        }
                    ]
                }
            },
            "PlanoLinha": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "paciente_id": {
                        "type": "integer"
                    },
                    "paciente_nome": {
                        "type": "string"
                    },
                    "versao": {
                        "type": "integer"
                    },
                    "estado": {
                        "type": "string"
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "enxertos_necessarios": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "capacidade_vida": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "sessoes": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "balanco": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "impressao_digital": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "aprovado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "PlanoEditor": {
                "type": "object",
                "properties": {
                    "modo": {
                        "type": "string",
                        "enum": [
                            "completo",
                            "resumo"
                        ]
                    },
                    "plano": {
                        "$ref": "#/components/schemas/PlanoLinha"
                    },
                    "resumo": {
                        "type": "object"
                    },
                    "zonas": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "dadoras": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "referencias": {
                        "type": "object"
                    },
                    "areas_diagrama": {
                        "type": "object"
                    },
                    "resultado": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/ResultadoMotor"
                            },
                            {
                                "type": "null"
                            }
                        ]
                    },
                    "motor": {
                        "type": "object"
                    },
                    "versoes": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "conta_dadora": {
                        "$ref": "#/components/schemas/ContaDadora"
                    },
                    "simulacao": {
                        "$ref": "#/components/schemas/Simulacao"
                    },
                    "capturas": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "tricoscopia": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "permissoes": {
                        "type": "object"
                    },
                    "opcoes": {
                        "type": "object"
                    }
                }
            },
            "Comparacao": {
                "type": "object",
                "properties": {
                    "enxertos": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "cobertura": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "densidade_media": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "zonas": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "sessoes": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "dadora_restante": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "disponivel": {
                        "type": "boolean"
                    },
                    "razao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            },
            "ContaDadora": {
                "type": "object",
                "properties": {
                    "capacidade": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "extraidos": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "reserva": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "reserva_pct": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "disponivel": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "planeado": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "teto_vida": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "teto_usado": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "usado": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "formula": {
                        "type": "string"
                    },
                    "linhas": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    }
                }
            },
            "SimulacaoGerada": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "plano_id": {
                        "type": "integer"
                    },
                    "cenario": {
                        "type": "string",
                        "enum": [
                            "conservador",
                            "provavel",
                            "agressivo"
                        ]
                    },
                    "cenario_rotulo": {
                        "type": "string"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "por_validar",
                            "validada",
                            "rejeitada"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "rosto": {
                        "type": "string",
                        "enum": [
                            "desfocado",
                            "visivel",
                            "sem_rosto"
                        ]
                    },
                    "rosto_rotulo": {
                        "type": "string"
                    },
                    "url": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "uri"
                    },
                    "foto_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "foto_origem_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "sha256": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "servico": {
                        "type": "string",
                        "enum": [
                            "local",
                            "externo"
                        ]
                    },
                    "servico_rotulo": {
                        "type": "string"
                    },
                    "semelhanca": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "criado_por_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "validada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "validada_por_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "nota": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "usada_no_plano": {
                        "type": "boolean"
                    }
                }
            },
            "SimulacaoIaEstado": {
                "type": "object",
                "properties": {
                    "disponivel": {
                        "type": "boolean"
                    },
                    "migracao": {
                        "type": "boolean"
                    },
                    "configurado": {
                        "type": "boolean"
                    },
                    "consentimento": {
                        "type": "boolean"
                    },
                    "rosto_visivel": {
                        "type": "boolean"
                    },
                    "aviso": {
                        "type": "string"
                    },
                    "cenario_plano": {
                        "type": "string"
                    },
                    "cenarios": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "fotos": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "geradas": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/SimulacaoGerada"
                        }
                    },
                    "limite": {
                        "type": "integer"
                    },
                    "permissoes": {
                        "type": "object",
                        "properties": {
                            "gerar": {
                                "type": "boolean"
                            },
                            "validar": {
                                "type": "boolean"
                            },
                            "usar": {
                                "type": "boolean"
                            }
                        }
                    },
                    "gerada": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/SimulacaoGerada"
                            },
                            {
                                "type": "null"
                            }
                        ]
                    }
                }
            },
            "Simulacao": {
                "type": "object",
                "properties": {
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "url": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "uri"
                    },
                    "aviso": {
                        "type": "string"
                    },
                    "sha256": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "mostrada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "mostrada_por_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "aviso_aceite_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "aviso_canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "presencial",
                            "portal",
                            "app",
                            null
                        ]
                    }
                },
                "example": {
                    "ficheiro_id": 7781,
                    "aviso": "Ilustrativo, sem garantia de resultado",
                    "mostrada_em": "2026-10-28T12:00:00+00:00",
                    "aviso_aceite_em": null
                }
            },
            "VersaoMotorLinha": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "versao": {
                        "type": "integer"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "rascunho",
                            "aprovada",
                            "arquivada"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "aprovado_por_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "aprovado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "base_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    }
                }
            },
            "VersaoMotor": {
                "allOf": [
                    {
                        "$ref": "#/components/schemas/VersaoMotorLinha"
                    },
                    {
                        "type": "object",
                        "properties": {
                            "quadro": {
                                "type": "array",
                                "items": {
                                    "type": "object"
                                }
                            },
                            "cenarios": {
                                "type": "object"
                            },
                            "ordem_propostas": {
                                "type": "array",
                                "items": {
                                    "type": "object"
                                }
                            },
                            "tabela_norwood": {
                                "type": "object"
                            },
                            "areas_diagrama": {
                                "type": "object"
                            },
                            "notas": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "finalidade_regulamentar": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "diferencas": {
                                "type": "array",
                                "items": {
                                    "type": "object"
                                }
                            },
                            "permissoes": {
                                "type": "object"
                            }
                        }
                    }
                ]
            },
            "Protocolo": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "marco": {
                        "type": "string"
                    },
                    "vistas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "instrucoes": {
                                    "type": "string"
                                },
                                "silhueta": {
                                    "type": "string",
                                    "enum": [
                                        "frontal",
                                        "frontal_inclinada",
                                        "topo",
                                        "coroa",
                                        "lateral_esq",
                                        "lateral_dir",
                                        "dadora"
                                    ]
                                }
                            }
                        }
                    }
                }
            },
            "Qualidade": {
                "type": "object",
                "properties": {
                    "avaliada": {
                        "type": "boolean"
                    },
                    "ok": {
                        "type": [
                            "boolean",
                            "null"
                        ]
                    },
                    "pontuacao": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "largura": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "altura": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "nitidez": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "brilho": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "motivos": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "textos": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    }
                }
            },
            "Foto": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "paciente_id": {
                        "type": "integer"
                    },
                    "captura_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "marco_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "ficheiro_id": {
                        "type": "integer"
                    },
                    "url": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "uri"
                    },
                    "vista": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "zona": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "etiquetas": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "album": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "origem": {
                        "type": "string"
                    },
                    "estado": {
                        "type": "string"
                    },
                    "partilhada_paciente": {
                        "type": "boolean"
                    },
                    "rosto_desfocado": {
                        "type": "boolean"
                    },
                    "simulacao": {
                        "type": "boolean"
                    },
                    "qualidade": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "Modelo3d": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "paciente_id": {
                        "type": "integer"
                    },
                    "formato": {
                        "type": "string",
                        "enum": [
                            "glb",
                            "gltf",
                            "obj",
                            "ply",
                            "stl",
                            "usdz"
                        ]
                    },
                    "visualizavel": {
                        "type": "boolean"
                    },
                    "url": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "descarregar": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "ligacao_visualizador": {
                        "type": "object"
                    },
                    "cobertura_pct": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "cobertura_ok": {
                        "type": "boolean"
                    },
                    "escala_confirmada": {
                        "type": "boolean"
                    },
                    "qualidade": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "referencias": {
                        "type": "object"
                    },
                    "zonas": {
                        "type": "object"
                    },
                    "area_dadora": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "origem": {
                        "type": "string",
                        "enum": [
                            "carregado",
                            "lidar",
                            "profundidade"
                        ]
                    },
                    "aparelho": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "cobertura_origem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "malha",
                            "captura",
                            "manual",
                            null
                        ]
                    },
                    "escala_metodo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "escala_fator": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "description": "cm por unidade do modelo"
                    },
                    "unidade_modelo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "malha": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "referencial": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "captura": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "zonas_erro": {
                        "type": "object"
                    },
                    "dadoras": {
                        "type": "object"
                    },
                    "espessura_cabelo": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "linha_frontal": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "simulacao": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "marcacoes": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "pontos_tricoscopia": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "partilhas": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    }
                }
            },
            "CampoTricoscopia": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "paciente_id": {
                        "type": "integer"
                    },
                    "subzona": {
                        "type": "string"
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "aparelho": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "ampliacao": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "area_campo_mm2": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "ponto": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "uf_1": {
                        "type": "integer"
                    },
                    "uf_2": {
                        "type": "integer"
                    },
                    "uf_3": {
                        "type": "integer"
                    },
                    "uf_4": {
                        "type": "integer"
                    },
                    "densidade_uf_cm2": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "densidade_cabelos_cm2": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "cabelos_por_uf": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "calibre_mm": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    }
                }
            },
            "CalculoCampo": {
                "type": "object",
                "properties": {
                    "uf_total": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "cabelos_total": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "densidade_uf_cm2": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "densidade_cabelos_cm2": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "cabelos_por_uf": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "calibre": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "composicao": {
                        "type": "object"
                    },
                    "pct_vellus": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "pct_intermedios": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "pct_terminais": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "miniaturizacao": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "racio_terminal_vellus": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "valor_cobertura": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "avisos": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "formulas": {
                        "type": "object"
                    },
                    "limiares": {
                        "type": "object"
                    }
                }
            },
            "QuadroMarcos": {
                "type": "object",
                "properties": {
                    "colunas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "estado": {
                                    "type": "string"
                                },
                                "titulo": {
                                    "type": "string"
                                },
                                "tom": {
                                    "type": "string"
                                },
                                "contagem": {
                                    "type": "integer"
                                },
                                "cartoes": {
                                    "type": "array",
                                    "items": {
                                        "type": "object"
                                    }
                                }
                            }
                        }
                    },
                    "kpis": {
                        "type": "object"
                    },
                    "marcos": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "permissoes": {
                        "type": "object"
                    }
                }
            },
            "DetalheMarco": {
                "type": "object",
                "properties": {
                    "marco": {
                        "type": "object"
                    },
                    "paciente": {
                        "type": "object"
                    },
                    "questionario": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "fotos": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "circuito": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "metricas": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "tratamentos": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "permissoes": {
                        "type": "object"
                    }
                }
            },
            "Caixa": {
                "type": "object",
                "properties": {
                    "x": {
                        "type": "number"
                    },
                    "y": {
                        "type": "number"
                    },
                    "largura": {
                        "type": "number"
                    },
                    "altura": {
                        "type": "number"
                    }
                },
                "description": "Frações 0–1 da imagem (canto superior esquerdo, largura, altura)."
            },
            "ElementoDesenho": {
                "type": "object",
                "required": [
                    "tipo",
                    "pontos"
                ],
                "properties": {
                    "id": {
                        "type": "string",
                        "pattern": "^[a-z0-9_-]{1,24}$"
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "traco",
                            "seta",
                            "texto",
                            "medida"
                        ]
                    },
                    "pontos": {
                        "type": "array",
                        "items": {
                            "type": "array",
                            "items": {
                                "type": "number"
                            },
                            "minItems": 2,
                            "maxItems": 2
                        }
                    },
                    "cor": {
                        "type": "string",
                        "enum": [
                            "marca",
                            "ouro",
                            "dadora",
                            "info",
                            "aviso",
                            "perigo",
                            "sucesso",
                            "tinta"
                        ]
                    },
                    "espessura": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 8
                    },
                    "tracejado": {
                        "type": "boolean"
                    },
                    "fechado": {
                        "type": "boolean"
                    },
                    "texto": {
                        "type": "string",
                        "maxLength": 200
                    },
                    "tamanho": {
                        "type": "integer",
                        "minimum": 10,
                        "maximum": 48
                    },
                    "referencia_mm": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "comprimento_px": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "readOnly": true
                    },
                    "comprimento_mm": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "readOnly": true
                    }
                }
            },
            "Anotacoes": {
                "type": "object",
                "properties": {
                    "foto": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "paciente_id": {
                                "type": "integer"
                            },
                            "ficheiro_id": {
                                "type": "integer"
                            },
                            "url": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "largura": {
                                "type": "integer"
                            },
                            "altura": {
                                "type": "integer"
                            },
                            "vista": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "vista_rotulo": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "rosto_desfocado": {
                                "type": "boolean"
                            },
                            "simulacao": {
                                "type": "boolean"
                            }
                        }
                    },
                    "camadas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "ordem": {
                                    "type": "integer"
                                },
                                "visivel": {
                                    "type": "boolean"
                                },
                                "origem": {
                                    "type": "string",
                                    "enum": [
                                        "manual",
                                        "proporcoes"
                                    ]
                                },
                                "autor_nome": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "atualizado_em": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "format": "date-time"
                                },
                                "editavel": {
                                    "type": "boolean"
                                },
                                "elementos": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/ElementoDesenho"
                                    }
                                }
                            }
                        }
                    },
                    "escala": {
                        "type": "object",
                        "properties": {
                            "mm_px": {
                                "type": [
                                    "number",
                                    "null"
                                ]
                            },
                            "camada_id": {
                                "type": [
                                    "integer",
                                    "null"
                                ]
                            }
                        }
                    },
                    "cores": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "tipos": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "permissoes": {
                        "type": "object"
                    },
                    "camada_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    }
                }
            },
            "AnaliseImagem": {
                "type": "object",
                "description": "Proposta da IA de visão com rastreio (pedido, serviço, modelo, parâmetros, quem decidiu e quando).",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "tricoscopia_contagem",
                            "desfocagem",
                            "proporcoes"
                        ]
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "pendente",
                            "aceite",
                            "corrigida",
                            "recusada"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "paciente_id": {
                        "type": "integer"
                    },
                    "foto_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "tricoscopia_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "plano_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "url": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "contexto": {
                        "type": "object"
                    },
                    "fatores": {
                        "type": "object"
                    },
                    "confianca": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "fornecedor": {
                        "type": "string"
                    },
                    "fornecedor_rotulo": {
                        "type": "string"
                    },
                    "modelo": {
                        "type": "string"
                    },
                    "parametros": {
                        "type": "object"
                    },
                    "decidido_por_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "decidido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "AnaliseTricoscopia": {
                "allOf": [
                    {
                        "$ref": "#/components/schemas/AnaliseImagem"
                    },
                    {
                        "type": "object",
                        "properties": {
                            "proposta": {
                                "type": "object",
                                "properties": {
                                    "valores": {
                                        "type": "object"
                                    },
                                    "diametros_um": {
                                        "type": "array",
                                        "items": {
                                            "type": "integer"
                                        }
                                    },
                                    "qualidade": {
                                        "type": "string",
                                        "enum": [
                                            "boa",
                                            "media",
                                            "insuficiente"
                                        ]
                                    },
                                    "qualidade_rotulo": {
                                        "type": "string"
                                    },
                                    "observacoes": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        }
                                    }
                                }
                            },
                            "calculo": {
                                "oneOf": [
                                    {
                                        "$ref": "#/components/schemas/CalculoCampo"
                                    },
                                    {
                                        "type": "null"
                                    }
                                ]
                            },
                            "final": {
                                "type": [
                                    "object",
                                    "null"
                                ]
                            }
                        }
                    }
                ]
            },
            "AnaliseProporcoes": {
                "allOf": [
                    {
                        "$ref": "#/components/schemas/AnaliseImagem"
                    },
                    {
                        "type": "object",
                        "properties": {
                            "proposta": {
                                "type": "object",
                                "properties": {
                                    "trichion": {
                                        "type": "number"
                                    },
                                    "glabela": {
                                        "type": "number"
                                    },
                                    "subnasal": {
                                        "type": "number"
                                    },
                                    "mento": {
                                        "type": "number"
                                    },
                                    "linha_media": {
                                        "type": "number"
                                    }
                                }
                            },
                            "final": {
                                "type": [
                                    "object",
                                    "null"
                                ]
                            },
                            "tercos": {
                                "type": [
                                    "object",
                                    "null"
                                ]
                            },
                            "sugestao": {
                                "type": [
                                    "object",
                                    "null"
                                ],
                                "description": "trichion sugerido (fração da altura), subir_mm (positivo = a linha sugerida fica acima da atual; negativo = abaixo), altura_glabela_mm, razao, texto e fórmula."
                            },
                            "camada_id": {
                                "type": [
                                    "integer",
                                    "null"
                                ]
                            }
                        }
                    }
                ]
            },
            "MedicaoCapilar": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "tricograma",
                            "massa_capilar"
                        ]
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "paciente_id": {
                        "type": "integer"
                    },
                    "subzona": {
                        "type": "string"
                    },
                    "ponto": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "aparado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "horas": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "anagenio": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "telogenio": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "pct_anagenio": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "racio_at": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "indice_massa": {
                        "$ref": "#/components/schemas/ValorComUnidade"
                    },
                    "avisos": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            },
            "AnalisePlano": {
                "type": "object",
                "properties": {
                    "plano": {
                        "type": "object"
                    },
                    "perda_futura": {
                        "type": "object"
                    },
                    "expectativas": {
                        "type": "object"
                    },
                    "real": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "proporcoes": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/AnaliseProporcoes"
                            },
                            {
                                "type": "null"
                            }
                        ]
                    },
                    "fotos_frontais": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "permissoes": {
                        "type": "object"
                    }
                }
            },
            "Execucao": {
                "type": "object",
                "properties": {
                    "execucao": {
                        "type": "object"
                    },
                    "cirurgia": {
                        "type": "object"
                    },
                    "plano": {
                        "type": "object"
                    },
                    "zonas": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "dia0": {
                        "type": "object"
                    },
                    "implantacao": {
                        "type": "object"
                    },
                    "real": {
                        "type": "object"
                    },
                    "capturas": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "origens": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "permissoes": {
                        "type": "object"
                    }
                }
            },
            "PortalMarcacao": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "pedido",
                            "marcada",
                            "confirmada",
                            "em_curso",
                            "concluida",
                            "faltou",
                            "cancelada",
                            "remarcada"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "tom": {
                        "type": "string"
                    },
                    "tipo": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "nome": {
                                "type": "string"
                            },
                            "teleconsulta": {
                                "type": "boolean"
                            },
                            "cor": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    },
                    "profissional": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "profissional_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "origem": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "pode_confirmar": {
                        "type": "boolean"
                    },
                    "pode_alterar": {
                        "type": "boolean"
                    },
                    "pode_cancelar": {
                        "type": "boolean"
                    },
                    "limite_alteracao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "politica": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "antecedencia_h": {
                        "type": "integer",
                        "x-unidade": "h"
                    },
                    "teleconsulta": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "estado": {
                                "type": "string"
                            },
                            "estado_rotulo": {
                                "type": "string"
                            },
                            "pode_entrar": {
                                "type": "boolean"
                            },
                            "abre_em": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            },
                            "consentimento_dado": {
                                "type": "boolean"
                            }
                        }
                    }
                }
            },
            "PortalVaga": {
                "type": "object",
                "properties": {
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "profissional_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "profissional": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            },
            "PortalTipoMarcacao": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "duracao_min": {
                        "type": "integer",
                        "x-unidade": "min"
                    },
                    "teleconsulta": {
                        "type": "boolean"
                    },
                    "exige_sinal": {
                        "type": "boolean"
                    },
                    "valor_sinal": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "EUR"
                    },
                    "politica_cancelamento": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "antecedencia_h": {
                        "type": "integer",
                        "x-unidade": "h"
                    },
                    "cor": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            },
            "PortalPlano": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "versao": {
                        "type": "integer"
                    },
                    "episodio": {
                        "type": [
                            "object",
                            "null"
                        ]
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "enxertos_necessarios": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "x-unidade": "enxertos"
                    },
                    "sessoes": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "cenario": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "cenario_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "aprovado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "aprovado_por": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "area_total_cm2": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "cm²"
                    },
                    "zonas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "zona": {
                                    "type": "string"
                                },
                                "zona_rotulo": {
                                    "type": "string"
                                },
                                "area_cm2": {
                                    "type": [
                                        "number",
                                        "null"
                                    ],
                                    "x-unidade": "cm²"
                                },
                                "densidade_alvo": {
                                    "type": [
                                        "number",
                                        "null"
                                    ],
                                    "x-unidade": "UF/cm²"
                                },
                                "enxertos": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ],
                                    "x-unidade": "enxertos"
                                }
                            }
                        }
                    },
                    "simulacao": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "description": "A ligação (url) só existe depois de aceite o aviso «Ilustrativo, sem garantia de resultado».",
                        "properties": {
                            "disponivel": {
                                "type": "boolean"
                            },
                            "aviso_aceite_em": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            },
                            "url": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    }
                }
            },
            "PortalProposta": {
                "type": "object",
                "description": "Nunca inclui custos internos, margens nem comissões.",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "numero": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "enviada",
                            "vista",
                            "aceite",
                            "expirada",
                            "recusada"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "total": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "EUR"
                    },
                    "moeda": {
                        "type": "string"
                    },
                    "validade_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "enviada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "aceite_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "pode_aceitar": {
                        "type": "boolean"
                    },
                    "pdf_url": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "linhas": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "opcoes": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "descricao": {
                                    "type": "string"
                                },
                                "total": {
                                    "type": [
                                        "number",
                                        "null"
                                    ],
                                    "x-unidade": "EUR"
                                }
                            }
                        }
                    },
                    "subtotal": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "EUR"
                    },
                    "desconto_valor": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "EUR"
                    },
                    "iva_valor": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "EUR"
                    },
                    "prestacoes": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "opcao_aceite": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "plano_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    }
                }
            },
            "PortalDocumento": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "origem": {
                        "type": "string",
                        "enum": [
                            "documento",
                            "ficheiro"
                        ]
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "tipo": {
                        "type": "string"
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "estado": {
                        "type": "string"
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "assinado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "codigo_verificacao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "pode_assinar": {
                        "type": "boolean"
                    },
                    "lido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "url": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Ligação assinada /f/<token>, 15 minutos."
                    },
                    "url_descarregar": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            },
            "PortalFormulario": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "expira_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "seccoes": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "titulo": {
                                    "type": "string"
                                },
                                "campos": {
                                    "type": "array",
                                    "items": {
                                        "type": "object",
                                        "properties": {
                                            "chave": {
                                                "type": "string"
                                            },
                                            "tipo": {
                                                "type": "string",
                                                "enum": [
                                                    "texto",
                                                    "textoLongo",
                                                    "numero",
                                                    "data",
                                                    "booleano",
                                                    "escolha",
                                                    "multiEscolha"
                                                ]
                                            },
                                            "rotulo": {
                                                "type": "string"
                                            },
                                            "ajuda": {
                                                "type": [
                                                    "string",
                                                    "null"
                                                ]
                                            },
                                            "obrigatorio": {
                                                "type": "boolean"
                                            },
                                            "opcoes": {
                                                "type": "array",
                                                "items": {
                                                    "type": "object",
                                                    "properties": {
                                                        "valor": {
                                                            "type": "string"
                                                        },
                                                        "rotulo": {
                                                            "type": "string"
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            },
            "PortalFinalidade": {
                "type": "object",
                "properties": {
                    "finalidade": {
                        "type": "string"
                    },
                    "rotulo": {
                        "type": "string"
                    },
                    "descricao": {
                        "type": "string"
                    },
                    "decisao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "dado",
                            "recusado",
                            "revogado",
                            null
                        ]
                    },
                    "decisao_rotulo": {
                        "type": "string"
                    },
                    "em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "canal_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "versao": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "obrigatorio": {
                        "type": "boolean"
                    },
                    "base_legal": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "base_legal_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "pode_revogar": {
                        "type": "boolean"
                    },
                    "pode_dar": {
                        "type": "boolean"
                    },
                    "modelo_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    }
                }
            },
            "PortalModeloConsentimento": {
                "type": "object",
                "properties": {
                    "modelo_id": {
                        "type": "integer"
                    },
                    "chave": {
                        "type": "string"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "finalidade": {
                        "type": "string"
                    },
                    "finalidade_rotulo": {
                        "type": "string"
                    },
                    "versao": {
                        "type": "integer"
                    },
                    "obrigatorio": {
                        "type": "boolean"
                    },
                    "reflexao_horas": {
                        "type": "integer",
                        "x-unidade": "h"
                    },
                    "informacao_entregue_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "pode_assinar_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "pode_assinar": {
                        "type": "boolean"
                    },
                    "precisa_ler": {
                        "type": "boolean"
                    },
                    "texto": {
                        "type": "string",
                        "description": "HTML sanitizado (só no detalhe)."
                    },
                    "campos_dgs": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string"
                                },
                                "titulo": {
                                    "type": "string"
                                },
                                "texto": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "assinatura": {
                        "type": "boolean"
                    },
                    "decisao_atual": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "motivo_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            },
            "PortalFoto": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "ficheiro_id": {
                        "type": "integer"
                    },
                    "vista": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "vista_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "estado": {
                        "type": "string"
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "url": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "luz": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "nitidez": {
                        "type": [
                            "number",
                            "null"
                        ]
                    }
                }
            },
            "PortalMensagem": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "minha": {
                        "type": "boolean"
                    },
                    "autor": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "corpo": {
                        "type": "string"
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "anexos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "nome": {
                                    "type": "string"
                                },
                                "tipo": {
                                    "type": "string"
                                },
                                "url": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                }
                            }
                        }
                    }
                }
            },
            "PortalPagamento": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "tipo": {
                        "type": "string"
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "valor": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "EUR"
                    },
                    "moeda": {
                        "type": "string"
                    },
                    "metodo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "metodo_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "estado": {
                        "type": "string"
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "tom": {
                        "type": "string"
                    },
                    "mb_entidade": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "mb_referencia": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "mb_validade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "telefone": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "vence_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "pago_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "pode_pagar": {
                        "type": "boolean"
                    },
                    "fatura": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/PortalFatura"
                            },
                            {
                                "type": "null"
                            }
                        ]
                    }
                }
            },
            "PortalFatura": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "tipo": {
                        "type": "string"
                    },
                    "numero": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "atcud": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "total": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "EUR"
                    },
                    "iva": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "EUR"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "emitido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "url": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            },
            "PortalSaldo": {
                "type": [
                    "object",
                    "null"
                ],
                "properties": {
                    "total_aceite": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "EUR"
                    },
                    "pago": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "EUR"
                    },
                    "em_divida": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "EUR"
                    },
                    "pendente": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "EUR"
                    },
                    "pendentes": {
                        "type": "integer"
                    },
                    "moeda": {
                        "type": "string"
                    },
                    "pct_pago": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "x-unidade": "%"
                    }
                }
            },
            "PortalInstrucoesPagamento": {
                "type": "object",
                "properties": {
                    "pagamento_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "metodo": {
                        "type": "string"
                    },
                    "valor": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "x-unidade": "EUR"
                    },
                    "mb_entidade": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "mb_referencia": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "mb_validade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "url": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "mensagem": {
                        "type": "string"
                    }
                }
            },
            "PortalMarco": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "marco": {
                        "type": "string",
                        "enum": [
                            "d1",
                            "s1",
                            "m1",
                            "m2",
                            "m6",
                            "m9",
                            "m12",
                            "m18"
                        ]
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "data_prevista": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "estado": {
                        "type": "string"
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "feito": {
                        "type": "boolean"
                    },
                    "passado": {
                        "type": "boolean"
                    },
                    "pede_fotos": {
                        "type": "boolean"
                    },
                    "marcacao_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "calculado": {
                        "type": "boolean"
                    }
                }
            },
            "PortalConteudoFase": {
                "type": "object",
                "properties": {
                    "origem": {
                        "type": "string",
                        "enum": [
                            "clinica",
                            "geral"
                        ]
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "html": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "itens": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "videos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "titulo": {
                                    "type": "string"
                                },
                                "url": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "mime": {
                                    "type": "string"
                                }
                            }
                        }
                    }
                }
            },
            "PortalAcesso": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "quando": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "quem": {
                        "type": "string"
                    },
                    "funcao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "ator_tipo": {
                        "type": "string"
                    },
                    "proprio": {
                        "type": "boolean"
                    },
                    "acao": {
                        "type": "string"
                    },
                    "acao_rotulo": {
                        "type": "string"
                    },
                    "area": {
                        "type": "string"
                    },
                    "origem": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "origem_rotulo": {
                        "type": "string"
                    },
                    "emergencia": {
                        "type": "boolean"
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Só nos acessos de emergência."
                    }
                }
            },
            "PortalPedido": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "contactos",
                            "alergias",
                            "acesso",
                            "retificacao",
                            "portabilidade",
                            "apagamento",
                            "oposicao",
                            "limitacao",
                            "eliminar_conta"
                        ]
                    },
                    "tipo_rotulo": {
                        "type": "string"
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "pendente",
                            "em_analise",
                            "aceite",
                            "recusado",
                            "concluido",
                            "cancelado"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "prazo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date"
                    },
                    "decidido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "resposta": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "mensagem": {
                        "type": "string"
                    }
                }
            },
            "PortalNovidade": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "tipo": {
                        "type": "string"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "corpo": {
                        "type": "string"
                    },
                    "ligacao": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "web": {
                                "type": "string"
                            },
                            "app": {
                                "type": "string"
                            }
                        }
                    },
                    "lida_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "PortalDados": {
                "type": "object",
                "properties": {
                    "paciente": {
                        "type": "object",
                        "properties": {
                            "numero": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "nome_completo": {
                                "type": "string"
                            },
                            "data_nascimento": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date"
                            },
                            "email": {
                                "type": "string"
                            },
                            "telefone": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "telefone_alt": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "morada": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "codigo_postal": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "localidade": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "pais": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "idioma": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    },
                    "alergias": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "descricao": {
                                    "type": "string"
                                },
                                "gravidade": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "gravidade_rotulo": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "validado": {
                                    "type": "boolean"
                                }
                            }
                        }
                    },
                    "preferencias": {
                        "type": "object",
                        "properties": {
                            "idioma": {
                                "type": "string"
                            },
                            "canal_preferido": {
                                "type": "string",
                                "enum": [
                                    "email",
                                    "sms",
                                    "whatsapp",
                                    "telefone"
                                ]
                            },
                            "lembretes": {
                                "type": "boolean"
                            },
                            "horario": {
                                "type": "string",
                                "enum": [
                                    "manha",
                                    "tarde",
                                    "qualquer"
                                ]
                            },
                            "avisos_email": {
                                "type": "boolean"
                            },
                            "marketing": {
                                "type": "boolean"
                            }
                        }
                    },
                    "pedidos": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/PortalPedido"
                        }
                    },
                    "conta": {
                        "type": "object"
                    },
                    "direitos": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "conservacao": {
                        "type": "string"
                    },
                    "encarregado": {
                        "type": "object"
                    },
                    "clinica": {
                        "type": "object"
                    },
                    "idiomas": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    }
                }
            },
            "DesafioEscudo": {
                "type": [
                    "object",
                    "null"
                ],
                "properties": {
                    "desafio": {
                        "type": "string"
                    },
                    "salt": {
                        "type": "string",
                        "pattern": "^[0-9a-f]{32}$"
                    },
                    "bits": {
                        "type": "integer"
                    },
                    "nivel": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 4
                    },
                    "valido_por": {
                        "type": "integer"
                    },
                    "minimo_ms": {
                        "type": "integer"
                    }
                }
            },
            "AvisoCanal": {
                "type": [
                    "object",
                    "null"
                ],
                "description": "Aviso de privacidade em vigor do canal (versionado, imutável depois de publicado), com o testemunho da versão mostrada: devolva-o em «aviso_testemunho» no envio. Null quando a clínica não publicou aviso para o canal.",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "canal": {
                        "type": "string"
                    },
                    "canal_rotulo": {
                        "type": "string"
                    },
                    "versao": {
                        "type": "integer"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "texto": {
                        "type": "string",
                        "description": "HTML sanitizado."
                    },
                    "idioma": {
                        "type": "string",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ]
                    },
                    "publicado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "resumo": {
                        "type": "string",
                        "description": "SHA-256 do texto publicado."
                    },
                    "contexto": {
                        "type": "string"
                    },
                    "testemunho": {
                        "type": "string",
                        "description": "Testemunho assinado (24 h) da versão mostrada."
                    }
                }
            },
            "PreAvaliacaoConsulta": {
                "type": "object",
                "description": "Escolha da consulta (ligação de registo com fotografias): modalidades com o tipo de marcação da agenda correspondente, períodos e datas permitidas.",
                "properties": {
                    "ativa": {
                        "type": "boolean"
                    },
                    "obrigatoria": {
                        "type": "boolean"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "texto": {
                        "type": "string"
                    },
                    "modalidades": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "valor": {
                                    "type": "string",
                                    "enum": [
                                        "presencial",
                                        "telefone",
                                        "video"
                                    ]
                                },
                                "rotulo": {
                                    "type": "string"
                                },
                                "descricao": {
                                    "type": "string"
                                },
                                "tipo_id": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "tipo_nome": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "duracao": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                }
                            }
                        }
                    },
                    "periodos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "valor": {
                                    "type": "string",
                                    "enum": [
                                        "manha",
                                        "tarde",
                                        "fim_dia"
                                    ]
                                },
                                "rotulo": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "data_minima": {
                        "type": "string",
                        "format": "date"
                    },
                    "data_maxima": {
                        "type": "string",
                        "format": "date"
                    }
                }
            },
            "SiteIncorporacao": {
                "type": "object",
                "description": "Pré-avaliação incorporada noutros sites: estado, sites autorizados e a linha de código.",
                "properties": {
                    "ativa": {
                        "type": "boolean",
                        "description": "Ligada e com a pré-avaliação ativa."
                    },
                    "ligada": {
                        "type": "boolean"
                    },
                    "pre_avaliacao_ativa": {
                        "type": "boolean"
                    },
                    "dominios": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "description": "Origem autorizada (https://dominio ou https://*.dominio)."
                        }
                    },
                    "invalidos": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "codigo_clinica": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "url_script": {
                        "type": "string",
                        "format": "uri"
                    },
                    "url_pagina": {
                        "type": "string",
                        "format": "uri"
                    },
                    "url_pre_visualizar": {
                        "type": "string",
                        "format": "uri"
                    },
                    "origem_propria": {
                        "type": "string"
                    },
                    "codigo": {
                        "type": "object",
                        "properties": {
                            "pt": {
                                "type": "string"
                            },
                            "en": {
                                "type": "string"
                            },
                            "contentor": {
                                "type": "string"
                            }
                        }
                    },
                    "mensagens": {
                        "type": "object",
                        "properties": {
                            "enviado": {
                                "type": "string",
                                "description": "Evento emitido no elemento script quando a pessoa envia."
                            }
                        }
                    }
                }
            },
            "SitePaginaEditor": {
                "type": "object",
                "description": "Página do site com o estado por língua.",
                "properties": {
                    "chave": {
                        "type": "string"
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "institucional",
                            "procedimento",
                            "legal",
                            "caso"
                        ]
                    },
                    "ordem": {
                        "type": "integer"
                    },
                    "idiomas": {
                        "type": "object",
                        "description": "Por língua (pt, en).",
                        "additionalProperties": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "integer"
                                },
                                "titulo": {
                                    "type": "string"
                                },
                                "slug": {
                                    "type": "string"
                                },
                                "publicada": {
                                    "type": "boolean"
                                },
                                "versao": {
                                    "type": "integer"
                                },
                                "publicada_em": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "atualizado_em": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                }
                            }
                        }
                    },
                    "blocos": {
                        "type": "integer",
                        "description": "Blocos editáveis do catálogo."
                    },
                    "personalizados": {
                        "type": "object",
                        "description": "Blocos gravados por língua.",
                        "additionalProperties": {
                            "type": "integer"
                        }
                    },
                    "url": {
                        "type": "string",
                        "format": "uri"
                    }
                }
            },
            "SiteBloco": {
                "type": "object",
                "description": "Bloco editável (texto, imagem, lista ou ligação).",
                "properties": {
                    "id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "pagina": {
                        "type": "string"
                    },
                    "chave": {
                        "type": "string"
                    },
                    "idioma": {
                        "type": "string",
                        "enum": [
                            "pt",
                            "en"
                        ]
                    },
                    "tipo": {
                        "type": "string",
                        "enum": [
                            "texto",
                            "textoLongo",
                            "html",
                            "imagem",
                            "lista",
                            "ligacao"
                        ]
                    },
                    "seccao": {
                        "type": "string"
                    },
                    "rotulo": {
                        "type": "string"
                    },
                    "ajuda": {
                        "type": "string"
                    },
                    "valor": {
                        "description": "texto/textoLongo/html/imagem: string (na imagem, a descrição); lista: array de objetos; ligacao: {texto, url}."
                    },
                    "campos": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "description": "Nas listas: campo → tipo (texto, textoLongo, linhas, numero).",
                        "additionalProperties": {
                            "type": "string"
                        }
                    },
                    "imagem": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "url": {
                                "type": "string"
                            },
                            "nome": {
                                "type": "string"
                            },
                            "largura": {
                                "type": "integer"
                            },
                            "altura": {
                                "type": "integer"
                            }
                        }
                    },
                    "personalizado": {
                        "type": "boolean"
                    },
                    "atualizado_em": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "ordem": {
                        "type": "integer"
                    }
                }
            },
            "SiteImagem": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string",
                        "format": "uri"
                    },
                    "mime": {
                        "type": "string",
                        "enum": [
                            "image/jpeg",
                            "image/png",
                            "image/webp",
                            "image/gif"
                        ]
                    },
                    "largura": {
                        "type": "integer",
                        "x-unidade": "px"
                    },
                    "altura": {
                        "type": "integer",
                        "x-unidade": "px"
                    },
                    "tamanho": {
                        "type": "integer",
                        "x-unidade": "bytes"
                    },
                    "alt_pt": {
                        "type": "string"
                    },
                    "alt_en": {
                        "type": "string"
                    },
                    "usos": {
                        "type": "integer",
                        "description": "Blocos e páginas que a usam (só se apaga com 0)."
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "SiteVersao": {
                "type": "object",
                "description": "Versão publicada imutável.",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "versao": {
                        "type": "integer"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "conteudo_hash": {
                        "type": "string",
                        "description": "SHA-256 do conteúdo publicado."
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "criado_por": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "SiteCookiesResumo": {
                "type": "object",
                "properties": {
                    "aceitar": {
                        "type": "integer"
                    },
                    "rejeitar": {
                        "type": "integer"
                    },
                    "personalizar": {
                        "type": "integer"
                    },
                    "total": {
                        "type": "integer"
                    },
                    "taxa_aceitacao": {
                        "type": "number",
                        "x-unidade": "%"
                    },
                    "taxa_rejeicao": {
                        "type": "number",
                        "x-unidade": "%"
                    },
                    "categorias": {
                        "type": "object",
                        "properties": {
                            "preferencias": {
                                "type": "integer"
                            },
                            "estatistica": {
                                "type": "integer"
                            },
                            "marketing": {
                                "type": "integer"
                            }
                        }
                    },
                    "donut": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "x": {
                                    "type": "string"
                                },
                                "y": {
                                    "type": "integer"
                                },
                                "decisao": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "serie": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "x": {
                                    "type": "string"
                                },
                                "y": {
                                    "type": "integer"
                                },
                                "serie": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "versao_politica": {
                        "type": "string"
                    }
                }
            },
            "SiteAoVivo": {
                "type": "object",
                "properties": {
                    "minutos": {
                        "type": "integer"
                    },
                    "visitas": {
                        "type": "integer"
                    },
                    "ativos_agora": {
                        "type": "integer",
                        "description": "Sessões com atividade nos últimos 5 minutos."
                    },
                    "cookies": {
                        "type": "object",
                        "properties": {
                            "aceitar": {
                                "type": "integer"
                            },
                            "rejeitar": {
                                "type": "integer"
                            },
                            "personalizar": {
                                "type": "integer"
                            },
                            "total": {
                                "type": "integer"
                            },
                            "ultimas": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "id": {
                                            "type": "integer"
                                        },
                                        "decisao": {
                                            "type": "string",
                                            "enum": [
                                                "aceitar",
                                                "rejeitar",
                                                "personalizar"
                                            ]
                                        },
                                        "categorias": {
                                            "type": "array",
                                            "items": {
                                                "type": "string"
                                            }
                                        },
                                        "em": {
                                            "type": [
                                                "string",
                                                "null"
                                            ],
                                            "format": "date-time"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    }
                }
            },
            "SiteAnalytics": {
                "type": "object",
                "description": "Estatísticas próprias, anónimas, sem cookies.",
                "properties": {
                    "periodo": {
                        "type": "object",
                        "properties": {
                            "de": {
                                "type": "string"
                            },
                            "ate": {
                                "type": "string"
                            },
                            "dias": {
                                "type": "integer"
                            },
                            "area": {
                                "type": "string"
                            }
                        }
                    },
                    "kpis": {
                        "type": "object",
                        "properties": {
                            "visitas": {
                                "type": "integer"
                            },
                            "visitas_delta": {
                                "type": [
                                    "number",
                                    "null"
                                ],
                                "x-unidade": "%"
                            },
                            "sessoes": {
                                "type": "integer"
                            },
                            "sessoes_delta": {
                                "type": [
                                    "number",
                                    "null"
                                ],
                                "x-unidade": "%"
                            },
                            "paginas_por_sessao": {
                                "type": "number"
                            },
                            "telemovel_pct": {
                                "type": "number",
                                "x-unidade": "%"
                            },
                            "pre_avaliacoes": {
                                "type": "integer"
                            },
                            "conversao_pct": {
                                "type": "number",
                                "x-unidade": "%"
                            },
                            "aceitacao_cookies_pct": {
                                "type": "number",
                                "x-unidade": "%"
                            }
                        }
                    },
                    "serie": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "x": {
                                    "type": "string"
                                },
                                "y": {
                                    "type": "integer"
                                },
                                "serie": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "paginas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "caminho": {
                                    "type": "string"
                                },
                                "area": {
                                    "type": "string"
                                },
                                "visitas": {
                                    "type": "integer"
                                },
                                "sessoes": {
                                    "type": "integer"
                                }
                            }
                        }
                    },
                    "origens": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "x": {
                                    "type": "string"
                                },
                                "y": {
                                    "type": "integer"
                                },
                                "serie": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "campanhas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "campanha": {
                                    "type": "string"
                                },
                                "fonte": {
                                    "type": "string"
                                },
                                "meio": {
                                    "type": "string"
                                },
                                "visitas": {
                                    "type": "integer"
                                }
                            }
                        }
                    },
                    "dispositivos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "x": {
                                    "type": "string"
                                },
                                "y": {
                                    "type": "integer"
                                },
                                "serie": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "idiomas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "x": {
                                    "type": "string"
                                },
                                "y": {
                                    "type": "integer"
                                },
                                "serie": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "conversoes": {
                        "type": "object",
                        "properties": {
                            "pre_avaliacoes": {
                                "type": "integer"
                            },
                            "leads": {
                                "type": [
                                    "integer",
                                    "null"
                                ]
                            },
                            "pedidos_demonstracao": {
                                "type": [
                                    "integer",
                                    "null"
                                ]
                            },
                            "serie": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "x": {
                                            "type": "string"
                                        },
                                        "y": {
                                            "type": "integer"
                                        },
                                        "serie": {
                                            "type": "string"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "cookies": {
                        "$ref": "#/components/schemas/SiteCookiesResumo"
                    },
                    "ao_vivo": {
                        "$ref": "#/components/schemas/SiteAoVivo"
                    }
                }
            },
            "PreAvaliacaoEsquema": {
                "type": "object",
                "description": "Formulário de pré-avaliação da clínica (perguntas, vistas das fotografias, consentimentos e limites).",
                "properties": {
                    "ativo": {
                        "type": "boolean"
                    },
                    "idioma": {
                        "type": "string"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "lead": {
                        "type": "string"
                    },
                    "aviso_privacidade": {
                        "type": "string",
                        "description": "HTML sanitizado do aviso versionado do canal «site» (ou, sem aviso publicado, o enquadramento do CMS). Mantido para versões anteriores da app."
                    },
                    "aviso": {
                        "$ref": "#/components/schemas/AvisoCanal"
                    },
                    "aviso_enquadramento": {
                        "type": "string",
                        "description": "Texto de apresentação do aviso (CMS, HTML sanitizado)."
                    },
                    "consulta": {
                        "$ref": "#/components/schemas/PreAvaliacaoConsulta"
                    },
                    "passos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string",
                                    "enum": [
                                        "privacidade",
                                        "sobre",
                                        "consentimentos",
                                        "cabelo",
                                        "saude",
                                        "fotografias",
                                        "consulta",
                                        "revisao"
                                    ]
                                },
                                "titulo": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "perguntas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string"
                                },
                                "passo": {
                                    "type": "string"
                                },
                                "tipo": {
                                    "type": "string",
                                    "enum": [
                                        "texto",
                                        "textoLongo",
                                        "email",
                                        "telefone",
                                        "numero",
                                        "escolha",
                                        "multiEscolha",
                                        "booleano",
                                        "data"
                                    ]
                                },
                                "obrigatorio": {
                                    "type": "boolean"
                                },
                                "rotulo": {
                                    "type": "string"
                                },
                                "ajuda": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "opcoes": {
                                    "type": "array",
                                    "items": {
                                        "type": "object",
                                        "properties": {
                                            "valor": {
                                                "type": "string"
                                            },
                                            "rotulo": {
                                                "type": "string"
                                            }
                                        }
                                    }
                                },
                                "min": {
                                    "type": [
                                        "number",
                                        "null"
                                    ]
                                },
                                "max": {
                                    "type": [
                                        "number",
                                        "null"
                                    ]
                                }
                            }
                        }
                    },
                    "formulario": {
                        "type": "object",
                        "properties": {
                            "origem": {
                                "type": "string",
                                "enum": [
                                    "clinica",
                                    "site"
                                ]
                            },
                            "id": {
                                "type": [
                                    "integer",
                                    "null"
                                ]
                            },
                            "versao": {
                                "type": "integer"
                            }
                        }
                    },
                    "vistas": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string"
                                },
                                "titulo": {
                                    "type": "string"
                                },
                                "instrucoes": {
                                    "type": "string"
                                },
                                "obrigatoria": {
                                    "type": "boolean"
                                }
                            }
                        }
                    },
                    "consentimentos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "finalidade": {
                                    "type": "string",
                                    "enum": [
                                        "tratamento_clinico",
                                        "fotografias_clinicas",
                                        "contacto",
                                        "marketing"
                                    ]
                                },
                                "texto": {
                                    "type": "string"
                                },
                                "obrigatorio": {
                                    "type": "boolean"
                                },
                                "valor": {
                                    "const": false
                                }
                            }
                        }
                    },
                    "limites": {
                        "type": "object",
                        "properties": {
                            "fotos_min": {
                                "type": "integer"
                            },
                            "fotos_max": {
                                "type": "integer"
                            },
                            "max_mb": {
                                "type": "integer",
                                "x-unidade": "MB"
                            }
                        }
                    },
                    "sucesso": {
                        "type": "object",
                        "properties": {
                            "titulo": {
                                "type": "string"
                            },
                            "texto": {
                                "type": "string"
                            }
                        }
                    },
                    "selo": {
                        "type": "string",
                        "description": "Selo de tempo a devolver no envio (_selo)."
                    },
                    "armadilha": {
                        "type": "string",
                        "description": "Nome do campo armadilha que tem de seguir vazio."
                    }
                }
            },
            "PreAvaliacaoDetalhe": {
                "type": "object",
                "description": "Pré-avaliação para revisão. fotos exige ficha.fotografias; respostas, triagem e nota médica exigem ficha.clinica. Leitura auditada.",
                "x-anagen-clinico": true,
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "email": {
                        "type": "string"
                    },
                    "telefone": {
                        "type": "string"
                    },
                    "pais": {
                        "type": "string"
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "idioma": {
                        "type": "string"
                    },
                    "origem": {
                        "type": "string",
                        "enum": [
                            "site",
                            "app"
                        ]
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "recebida",
                            "em_revisao",
                            "revista",
                            "respondida"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "procedimento": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "procedimento_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "triagem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "elegivel_provavel",
                            "avaliar",
                            "nao_elegivel_provavel",
                            null
                        ]
                    },
                    "triagem_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "parecer": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "consulta",
                            "teleconsulta",
                            "mais_fotos",
                            "nao_elegivel",
                            "outro",
                            null
                        ]
                    },
                    "parecer_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "nota_medica": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "consentimentos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "boolean"
                        }
                    },
                    "fotos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "ficheiro_id": {
                                    "type": "integer"
                                },
                                "vista": {
                                    "type": "string"
                                },
                                "url": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "description": "Ligação temporária (30 min)."
                                }
                            }
                        }
                    },
                    "respostas": {
                        "type": [
                            "array",
                            "null"
                        ],
                        "items": {
                            "type": "object",
                            "properties": {
                                "chave": {
                                    "type": "string"
                                },
                                "rotulo": {
                                    "type": "string"
                                },
                                "valor": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "revisto_por": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "revisto_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "respondido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "pode": {
                        "type": "object",
                        "properties": {
                            "rever": {
                                "type": "boolean"
                            },
                            "responder": {
                                "type": "boolean"
                            },
                            "fotos": {
                                "type": "boolean"
                            },
                            "respostas": {
                                "type": "boolean"
                            }
                        }
                    },
                    "email_enviado": {
                        "type": "boolean",
                        "description": "Só na resposta de POST …/resposta."
                    }
                }
            },
            "ApresentacaoConteudo": {
                "type": "object",
                "description": "Conteúdo completo da Apresentação do AnagenSys numa língua (secções → blocos).",
                "properties": {
                    "idioma": {
                        "type": "string",
                        "enum": [
                            "pt",
                            "en"
                        ]
                    },
                    "seccoes": {
                        "type": "object",
                        "description": "hero, numeros, jornada, funcionalidades, motor, conformidade, ia, plataformas, integracoes, diferenciacao, fases, faq, pedido. Cada secção é um objeto chave → valor (texto, lista, HTML, ligação {texto,url} ou imagem {id,url,alt}).",
                        "additionalProperties": {
                            "type": "object"
                        }
                    },
                    "formulario": {
                        "type": "object",
                        "properties": {
                            "especialidades": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "valor": {
                                            "type": "string"
                                        },
                                        "rotulo": {
                                            "type": "string"
                                        }
                                    }
                                }
                            },
                            "paises": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "valor": {
                                            "type": "string",
                                            "pattern": "^[A-Z]{2}$"
                                        },
                                        "rotulo": {
                                            "type": "string"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "meta": {
                        "type": "object",
                        "properties": {
                            "titulo": {
                                "type": "string"
                            },
                            "descricao": {
                                "type": "string"
                            },
                            "imagem": {
                                "type": "string"
                            }
                        }
                    },
                    "urls": {
                        "type": "object",
                        "properties": {
                            "pt": {
                                "type": "string"
                            },
                            "en": {
                                "type": "string"
                            },
                            "pdf": {
                                "type": "string"
                            },
                            "desenvolvedores": {
                                "type": "string"
                            }
                        }
                    },
                    "selo": {
                        "type": "string"
                    },
                    "armadilha": {
                        "type": "string"
                    }
                }
            },
            "ApresentacaoPedidoCartao": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "nome": {
                        "type": "string"
                    },
                    "clinica_nome": {
                        "type": "string"
                    },
                    "especialidade": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "especialidade_rotulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "pais": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "cirurgias_mes": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "estado": {
                        "type": "string",
                        "enum": [
                            "novo",
                            "contactado",
                            "demonstracao_marcada",
                            "proposta",
                            "ganho",
                            "perdido",
                            "arquivado"
                        ]
                    },
                    "estado_rotulo": {
                        "type": "string"
                    },
                    "tom": {
                        "type": "string",
                        "enum": [
                            "info",
                            "neutro",
                            "marca",
                            "ouro",
                            "sucesso",
                            "perigo"
                        ]
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "responsavel_nome": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "demonstracao_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "criado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time"
                    },
                    "ordem": {
                        "type": "integer"
                    }
                }
            },
            "ApresentacaoPedido": {
                "allOf": [
                    {
                        "$ref": "#/components/schemas/ApresentacaoPedidoCartao"
                    },
                    {
                        "type": "object",
                        "properties": {
                            "cargo": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "email": {
                                "type": "string"
                            },
                            "telefone": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "cirurgioes_n": {
                                "type": [
                                    "integer",
                                    "null"
                                ]
                            },
                            "sistemas_atuais": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "mensagem": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "idioma": {
                                "type": "string"
                            },
                            "origem": {
                                "type": "string",
                                "enum": [
                                    "site",
                                    "app"
                                ]
                            },
                            "utm": {
                                "type": "object",
                                "additionalProperties": {
                                    "type": "string"
                                }
                            },
                            "consentimento_em": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "date-time"
                            },
                            "notas": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "responsaveis": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "id": {
                                            "type": "integer"
                                        },
                                        "nome": {
                                            "type": "string"
                                        }
                                    }
                                }
                            },
                            "estados": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "valor": {
                                            "type": "string"
                                        },
                                        "rotulo": {
                                            "type": "string"
                                        }
                                    }
                                }
                            }
                        }
                    }
                ]
            },
            "Recurso_academia_certificados": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "codigo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Código",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Pessoa",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "curso_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Curso",
                        "x-anagen-recurso": "academia_cursos",
                        "readOnly": true
                    },
                    "nota": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Nota",
                        "x-unidade": "%",
                        "readOnly": true
                    },
                    "emitido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Emitido em",
                        "readOnly": true
                    },
                    "valido_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válido até",
                        "readOnly": true
                    },
                    "revogado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Revogado em",
                        "readOnly": true
                    },
                    "motivo_revogacao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-clinico": false
            },
            "Recurso_academia_certificados_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_academia_cursos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 190
                    },
                    "resumo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resumo",
                        "maxLength": 500
                    },
                    "categoria": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Categoria",
                        "description": "Casos clínicos: use só imagens e textos sem dados que identifiquem o paciente.",
                        "enum": [
                            "normas_captura",
                            "casos_clinicos",
                            "protecao_dados",
                            "atendimento",
                            "seguranca",
                            "procedimentos",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "normas_captura": "Normas de captura 3D e fotografia",
                            "casos_clinicos": "Casos clínicos (anonimizados)",
                            "protecao_dados": "Proteção de dados",
                            "atendimento": "Atendimento",
                            "seguranca": "Segurança do doente",
                            "procedimentos": "Procedimentos internos",
                            "outro": "Outros temas"
                        },
                        "default": "outro"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição"
                    },
                    "capa_ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Imagem de capa"
                    },
                    "duracao_minutos": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Duração",
                        "maximum": 6000,
                        "minimum": 1,
                        "x-unidade": "min"
                    },
                    "nota_minima": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Nota mínima no teste",
                        "maximum": 100,
                        "minimum": 0,
                        "x-unidade": "%",
                        "default": 80
                    },
                    "validade_meses": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Validade do certificado (meses)",
                        "description": "Vazio = sem prazo. Útil para formação que se repete (ex.: proteção de dados todos os anos).",
                        "maximum": 120,
                        "minimum": 1
                    },
                    "perfis": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "administracao",
                                "medico",
                                "enfermagem",
                                "tecnico",
                                "comercial",
                                "rececao"
                            ]
                        },
                        "title": "Perfis",
                        "description": "Vazio = toda a equipa.",
                        "x-enum-rotulos": {
                            "administracao": "Administração",
                            "medico": "Médicos",
                            "enfermagem": "Enfermagem",
                            "tecnico": "Técnicos",
                            "comercial": "Comercial",
                            "rececao": "Receção"
                        }
                    },
                    "obrigatorio": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Obrigatório",
                        "default": 0
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "rascunho",
                            "publicado",
                            "arquivado"
                        ],
                        "x-enum-rotulos": {
                            "rascunho": "Rascunho",
                            "publicado": "Publicado",
                            "arquivado": "Arquivado"
                        },
                        "default": "rascunho"
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 9999,
                        "minimum": 0,
                        "default": 0
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-clinico": false
            },
            "Recurso_academia_cursos_Entrada": {
                "type": "object",
                "properties": {
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 190
                    },
                    "resumo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resumo",
                        "maxLength": 500
                    },
                    "categoria": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Categoria",
                        "description": "Casos clínicos: use só imagens e textos sem dados que identifiquem o paciente.",
                        "enum": [
                            "normas_captura",
                            "casos_clinicos",
                            "protecao_dados",
                            "atendimento",
                            "seguranca",
                            "procedimentos",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "normas_captura": "Normas de captura 3D e fotografia",
                            "casos_clinicos": "Casos clínicos (anonimizados)",
                            "protecao_dados": "Proteção de dados",
                            "atendimento": "Atendimento",
                            "seguranca": "Segurança do doente",
                            "procedimentos": "Procedimentos internos",
                            "outro": "Outros temas"
                        },
                        "default": "outro"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição"
                    },
                    "capa_ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Imagem de capa"
                    },
                    "duracao_minutos": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Duração",
                        "maximum": 6000,
                        "minimum": 1,
                        "x-unidade": "min"
                    },
                    "nota_minima": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Nota mínima no teste",
                        "maximum": 100,
                        "minimum": 0,
                        "x-unidade": "%",
                        "default": 80
                    },
                    "validade_meses": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Validade do certificado (meses)",
                        "description": "Vazio = sem prazo. Útil para formação que se repete (ex.: proteção de dados todos os anos).",
                        "maximum": 120,
                        "minimum": 1
                    },
                    "perfis": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "administracao",
                                "medico",
                                "enfermagem",
                                "tecnico",
                                "comercial",
                                "rececao"
                            ]
                        },
                        "title": "Perfis",
                        "description": "Vazio = toda a equipa.",
                        "x-enum-rotulos": {
                            "administracao": "Administração",
                            "medico": "Médicos",
                            "enfermagem": "Enfermagem",
                            "tecnico": "Técnicos",
                            "comercial": "Comercial",
                            "rececao": "Receção"
                        }
                    },
                    "obrigatorio": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Obrigatório",
                        "default": 0
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "rascunho",
                            "publicado",
                            "arquivado"
                        ],
                        "x-enum-rotulos": {
                            "rascunho": "Rascunho",
                            "publicado": "Publicado",
                            "arquivado": "Arquivado"
                        },
                        "default": "rascunho"
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 9999,
                        "minimum": 0,
                        "default": 0
                    }
                },
                "required": [
                    "titulo",
                    "categoria"
                ]
            },
            "Recurso_academia_licoes": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "curso_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Curso",
                        "x-anagen-recurso": "academia_cursos"
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 190
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "texto",
                            "video",
                            "ficheiro"
                        ],
                        "x-enum-rotulos": {
                            "texto": "Texto",
                            "video": "Vídeo",
                            "ficheiro": "Ficheiro"
                        },
                        "default": "texto"
                    },
                    "conteudo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Conteúdo",
                        "description": "Texto da lição. Também serve de apoio ao vídeo."
                    },
                    "video_ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Vídeo"
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ficheiro de apoio"
                    },
                    "duracao_minutos": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Duração",
                        "maximum": 600,
                        "minimum": 1,
                        "x-unidade": "min"
                    },
                    "obrigatoria": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Obrigatória para fazer o teste",
                        "default": 1
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 9999,
                        "minimum": 0,
                        "default": 0
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-clinico": false
            },
            "Recurso_academia_licoes_Entrada": {
                "type": "object",
                "properties": {
                    "curso_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Curso",
                        "x-anagen-recurso": "academia_cursos"
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 190
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "texto",
                            "video",
                            "ficheiro"
                        ],
                        "x-enum-rotulos": {
                            "texto": "Texto",
                            "video": "Vídeo",
                            "ficheiro": "Ficheiro"
                        },
                        "default": "texto"
                    },
                    "conteudo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Conteúdo",
                        "description": "Texto da lição. Também serve de apoio ao vídeo."
                    },
                    "video_ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Vídeo"
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ficheiro de apoio"
                    },
                    "duracao_minutos": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Duração",
                        "maximum": 600,
                        "minimum": 1,
                        "x-unidade": "min"
                    },
                    "obrigatoria": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Obrigatória para fazer o teste",
                        "default": 1
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 9999,
                        "minimum": 0,
                        "default": 0
                    }
                },
                "required": [
                    "curso_id",
                    "titulo"
                ]
            },
            "Recurso_academia_percursos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 190
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resumo",
                        "maxLength": 1000
                    },
                    "perfis": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "administracao",
                                "medico",
                                "enfermagem",
                                "tecnico",
                                "comercial",
                                "rececao"
                            ]
                        },
                        "title": "Perfis",
                        "description": "Vazio = toda a equipa.",
                        "x-enum-rotulos": {
                            "administracao": "Administração",
                            "medico": "Médicos",
                            "enfermagem": "Enfermagem",
                            "tecnico": "Técnicos",
                            "comercial": "Comercial",
                            "rececao": "Receção"
                        }
                    },
                    "cursos": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "title": "Cursos",
                        "x-anagen-recurso": "academia_cursos"
                    },
                    "obrigatorio": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Obrigatório",
                        "default": 1
                    },
                    "prazo_dias": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Prazo (dias)",
                        "description": "Dias para concluir, contados a partir da entrada da pessoa ou da criação do percurso.",
                        "maximum": 730,
                        "minimum": 1,
                        "x-unidade": "dias"
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-clinico": false
            },
            "Recurso_academia_percursos_Entrada": {
                "type": "object",
                "properties": {
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 190
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resumo",
                        "maxLength": 1000
                    },
                    "perfis": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "administracao",
                                "medico",
                                "enfermagem",
                                "tecnico",
                                "comercial",
                                "rececao"
                            ]
                        },
                        "title": "Perfis",
                        "description": "Vazio = toda a equipa.",
                        "x-enum-rotulos": {
                            "administracao": "Administração",
                            "medico": "Médicos",
                            "enfermagem": "Enfermagem",
                            "tecnico": "Técnicos",
                            "comercial": "Comercial",
                            "rececao": "Receção"
                        }
                    },
                    "cursos": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "title": "Cursos",
                        "x-anagen-recurso": "academia_cursos"
                    },
                    "obrigatorio": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Obrigatório",
                        "default": 1
                    },
                    "prazo_dias": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Prazo (dias)",
                        "description": "Dias para concluir, contados a partir da entrada da pessoa ou da criação do percurso.",
                        "maximum": 730,
                        "minimum": 1,
                        "x-unidade": "dias"
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    }
                },
                "required": [
                    "titulo",
                    "cursos"
                ]
            },
            "Recurso_academia_perguntas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "curso_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Curso",
                        "x-anagen-recurso": "academia_cursos"
                    },
                    "enunciado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Pergunta",
                        "maxLength": 1000
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "unica",
                            "multipla",
                            "verdadeiro_falso"
                        ],
                        "x-enum-rotulos": {
                            "unica": "Uma resposta certa",
                            "multipla": "Várias respostas certas",
                            "verdadeiro_falso": "Verdadeiro ou falso"
                        },
                        "default": "unica"
                    },
                    "opcoes_texto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Opções",
                        "description": "Uma opção por linha. Comece a(s) certa(s) com *. Verdadeiro/falso pode ficar vazio.",
                        "maxLength": 3000
                    },
                    "explicacao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Explicação",
                        "description": "Mostrada depois de entregar o teste.",
                        "maxLength": 1000
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 9999,
                        "minimum": 0,
                        "default": 0
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-clinico": false
            },
            "Recurso_academia_perguntas_Entrada": {
                "type": "object",
                "properties": {
                    "curso_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Curso",
                        "x-anagen-recurso": "academia_cursos"
                    },
                    "enunciado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Pergunta",
                        "maxLength": 1000
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "unica",
                            "multipla",
                            "verdadeiro_falso"
                        ],
                        "x-enum-rotulos": {
                            "unica": "Uma resposta certa",
                            "multipla": "Várias respostas certas",
                            "verdadeiro_falso": "Verdadeiro ou falso"
                        },
                        "default": "unica"
                    },
                    "opcoes_texto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Opções",
                        "description": "Uma opção por linha. Comece a(s) certa(s) com *. Verdadeiro/falso pode ficar vazio.",
                        "maxLength": 3000
                    },
                    "explicacao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Explicação",
                        "description": "Mostrada depois de entregar o teste.",
                        "maxLength": 1000
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 9999,
                        "minimum": 0,
                        "default": 0
                    }
                },
                "required": [
                    "curso_id",
                    "enunciado"
                ]
            },
            "Recurso_acessos_emergencia": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Pedido por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes",
                        "readOnly": true
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Início",
                        "readOnly": true
                    },
                    "fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Fim",
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "ativo",
                            "expirado",
                            "revisto"
                        ],
                        "x-enum-rotulos": {
                            "ativo": "Ativo",
                            "expirado": "Por rever",
                            "revisto": "Revisto"
                        },
                        "readOnly": true
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo",
                        "readOnly": true
                    },
                    "decisao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Decisão",
                        "enum": [
                            "justificado",
                            "injustificado"
                        ],
                        "x-enum-rotulos": {
                            "justificado": "Justificado",
                            "injustificado": "Injustificado"
                        },
                        "readOnly": true
                    },
                    "revisto_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Revisto por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "revisto_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Revisto em",
                        "readOnly": true
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas da revisão",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-clinico": false
            },
            "Recurso_acessos_emergencia_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_agente_pedidos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal",
                        "enum": [
                            "voz",
                            "whatsapp",
                            "chat"
                        ],
                        "x-enum-rotulos": {
                            "voz": "Voz",
                            "whatsapp": "WhatsApp",
                            "chat": "Chat do site"
                        },
                        "readOnly": true
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "marcacao",
                            "informacao",
                            "pos_operatorio",
                            "pagamento",
                            "alarme",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "marcacao": "Marcação",
                            "informacao": "Informação",
                            "pos_operatorio": "Pós-operatório",
                            "pagamento": "Pagamento",
                            "alarme": "Sinal de alarme",
                            "outro": "Outro"
                        },
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "ia_a_tratar",
                            "passado_equipa",
                            "resolvido",
                            "validado"
                        ],
                        "x-enum-rotulos": {
                            "ia_a_tratar": "IA a tratar",
                            "passado_equipa": "Com a equipa",
                            "resolvido": "Resolvido",
                            "validado": "Validado"
                        },
                        "readOnly": true
                    },
                    "sinal_alarme": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Sinal de alarme",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "telefone": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Telefone",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes",
                        "readOnly": true
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Lead",
                        "x-anagen-recurso": "leads",
                        "readOnly": true
                    },
                    "intencao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Intenção",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "proximo_passo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Próximo passo",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "resumo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resumo",
                        "x-anagen-cifrado": "geral",
                        "readOnly": true
                    },
                    "transcricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Transcrição",
                        "x-anagen-permissao": "ficha.clinica",
                        "x-anagen-cifrado": "geral",
                        "readOnly": true
                    },
                    "notas_relatadas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas relatadas pelo paciente",
                        "x-anagen-permissao": "ficha.clinica",
                        "x-anagen-cifrado": "geral",
                        "readOnly": true
                    },
                    "duracao_s": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Duração",
                        "x-unidade": "s",
                        "readOnly": true
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "aviso_ia": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Aviso de IA dado",
                        "readOnly": true
                    },
                    "identificacao_verificada": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Identificação verificada",
                        "readOnly": true
                    },
                    "amostra": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Amostra para revisão",
                        "readOnly": true
                    },
                    "revisao_estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Revisão",
                        "enum": [
                            "conforme",
                            "a_corrigir"
                        ],
                        "x-enum-rotulos": {
                            "conforme": "Conforme",
                            "a_corrigir": "A corrigir"
                        },
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-clinico": false
            },
            "Recurso_agente_pedidos_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_agente_testes": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 160
                    },
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal",
                        "enum": [
                            "voz",
                            "escrito"
                        ],
                        "x-enum-rotulos": {
                            "voz": "Voz",
                            "escrito": "Escrito"
                        },
                        "default": "voz"
                    },
                    "lingua": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        },
                        "default": "pt-PT"
                    },
                    "turnos": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Falas",
                        "description": "Lista de {\"papel\": \"pessoa\" ou \"agente\", \"texto\"}; a última é de quem contacta."
                    },
                    "esperado": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "O que se espera",
                        "description": "{\"deve_conter\": [], \"nao_deve_conter\": [], \"passar_equipa\": true|false|null, \"sinal_alarme\": true|false|null, \"tipo\": null}."
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": true
                    },
                    "ultimo_resultado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Último resultado",
                        "enum": [
                            "passou",
                            "falhou"
                        ],
                        "x-enum-rotulos": {
                            "passou": "Passou",
                            "falhou": "Falhou"
                        },
                        "readOnly": true
                    },
                    "origem_pedido_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Criada a partir de",
                        "x-anagen-recurso": "agente_pedidos",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-clinico": false
            },
            "Recurso_agente_testes_Entrada": {
                "type": "object",
                "properties": {
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 160
                    },
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal",
                        "enum": [
                            "voz",
                            "escrito"
                        ],
                        "x-enum-rotulos": {
                            "voz": "Voz",
                            "escrito": "Escrito"
                        },
                        "default": "voz"
                    },
                    "lingua": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        },
                        "default": "pt-PT"
                    },
                    "turnos": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Falas",
                        "description": "Lista de {\"papel\": \"pessoa\" ou \"agente\", \"texto\"}; a última é de quem contacta."
                    },
                    "esperado": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "O que se espera",
                        "description": "{\"deve_conter\": [], \"nao_deve_conter\": [], \"passar_equipa\": true|false|null, \"sinal_alarme\": true|false|null, \"tipo\": null}."
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": true
                    }
                },
                "required": [
                    "titulo",
                    "turnos"
                ]
            },
            "Recurso_alertas_acesso": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Pessoa",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "volume",
                            "fora_horas",
                            "emergencia_repetida",
                            "exportacao_volumosa",
                            "falhas_entrada",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "volume": "Volume invulgar",
                            "fora_horas": "Fora de horas",
                            "emergencia_repetida": "Emergências repetidas",
                            "exportacao_volumosa": "Exportação volumosa",
                            "falhas_entrada": "Falhas de entrada",
                            "outro": "Outro"
                        },
                        "readOnly": true
                    },
                    "gravidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Gravidade",
                        "enum": [
                            "baixa",
                            "media",
                            "alta"
                        ],
                        "x-enum-rotulos": {
                            "baixa": "Baixa",
                            "media": "Média",
                            "alta": "Alta"
                        },
                        "readOnly": true
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "detetado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Detetado em",
                        "readOnly": true
                    },
                    "janela_inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Início do período",
                        "readOnly": true
                    },
                    "janela_fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Fim do período",
                        "readOnly": true
                    },
                    "dados": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Detalhe",
                        "readOnly": true
                    },
                    "decisao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Decisão",
                        "enum": [
                            "justificado",
                            "injustificado",
                            "falso_positivo"
                        ],
                        "x-enum-rotulos": {
                            "justificado": "Justificado",
                            "injustificado": "Injustificado",
                            "falso_positivo": "Falso positivo"
                        },
                        "readOnly": true
                    },
                    "revisto_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Revisto por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "revisto_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Revisto em",
                        "readOnly": true
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "admin.auditoria",
                "x-anagen-clinico": false
            },
            "Recurso_alertas_acesso_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_api_clientes": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 500
                    },
                    "client_id": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Identificador",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "segredo_prefixo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Início do segredo",
                        "description": "Para reconhecer qual segredo está em uso.",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "segredo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Segredo",
                        "description": "Copie-o agora: por segurança, não volta a ser mostrado.",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "ambitos": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "clinico.parametros:ver",
                                "clinico.parametros:editar",
                                "ficha.identificacao:ver",
                                "ficha.identificacao:editar",
                                "ficha.consentimentos:ver",
                                "ficha.consentimentos:editar",
                                "ficha.clinica:ver",
                                "ficha.clinica:editar",
                                "ficha.captura:ver",
                                "ficha.captura:editar",
                                "ficha.fotografias:ver",
                                "ficha.fotografias:editar",
                                "ficha.plano:ver",
                                "ficha.plano:editar",
                                "crm.leads:ver",
                                "crm.leads:editar",
                                "crm.atendimento:ver",
                                "crm.atendimento:editar",
                                "crm.telefonia:ver",
                                "crm.telefonia:editar",
                                "crm.agente:ver",
                                "crm.agente:editar",
                                "marketing:ver",
                                "marketing:editar",
                                "agenda:ver",
                                "agenda:editar",
                                "teleconsulta:ver",
                                "teleconsulta:editar",
                                "bloco.mapa:ver",
                                "bloco.mapa:editar",
                                "bloco.marcar:ver",
                                "bloco.marcar:editar",
                                "bloco.registo:ver",
                                "bloco.registo:editar",
                                "acompanhamento:ver",
                                "acompanhamento:editar",
                                "comercial.propostas:ver",
                                "comercial.propostas:editar",
                                "comercial.descontos:ver",
                                "comercial.descontos:editar",
                                "financeiro.pagamentos:ver",
                                "financeiro.pagamentos:editar",
                                "financeiro.valores:ver",
                                "financeiro.valores:editar",
                                "stock:ver",
                                "stock:editar",
                                "documentos:ver",
                                "documentos:editar",
                                "conformidade:ver",
                                "conformidade:editar",
                                "equipa.tarefas:ver",
                                "equipa.tarefas:editar",
                                "equipa.chat:ver",
                                "equipa.chat:editar",
                                "indicadores.financeiros:ver",
                                "indicadores.financeiros:editar",
                                "indicadores.vendas:ver",
                                "indicadores.vendas:editar",
                                "indicadores.operacionais:ver",
                                "indicadores.operacionais:editar",
                                "indicadores.atendimento:ver",
                                "indicadores.atendimento:editar",
                                "site.cms:ver",
                                "site.cms:editar"
                            ]
                        },
                        "title": "Autorizações",
                        "description": "O que este cliente pode ver ou alterar, módulo a módulo.",
                        "x-enum-rotulos": {
                            "clinico.parametros:ver": "Parâmetros clínicos · Ver",
                            "clinico.parametros:editar": "Parâmetros clínicos · Editar",
                            "ficha.identificacao:ver": "Identificação do paciente · Ver",
                            "ficha.identificacao:editar": "Identificação do paciente · Editar",
                            "ficha.consentimentos:ver": "Consentimentos · Ver",
                            "ficha.consentimentos:editar": "Consentimentos · Editar",
                            "ficha.clinica:ver": "Ficha clínica · Ver",
                            "ficha.clinica:editar": "Ficha clínica · Editar",
                            "ficha.captura:ver": "Captura e tricoscopia · Ver",
                            "ficha.captura:editar": "Captura e tricoscopia · Editar",
                            "ficha.fotografias:ver": "Fotografias clínicas · Ver",
                            "ficha.fotografias:editar": "Fotografias clínicas · Editar",
                            "ficha.plano:ver": "Plano cirúrgico · Ver",
                            "ficha.plano:editar": "Plano cirúrgico · Editar",
                            "crm.leads:ver": "Leads e funil · Ver",
                            "crm.leads:editar": "Leads e funil · Editar",
                            "crm.atendimento:ver": "Atendimento · Ver",
                            "crm.atendimento:editar": "Atendimento · Editar",
                            "crm.telefonia:ver": "Telefonia · Ver",
                            "crm.telefonia:editar": "Telefonia · Editar",
                            "crm.agente:ver": "Agente de conversação · Ver",
                            "crm.agente:editar": "Agente de conversação · Editar",
                            "marketing:ver": "Marketing · Ver",
                            "marketing:editar": "Marketing · Editar",
                            "agenda:ver": "Agenda · Ver",
                            "agenda:editar": "Agenda · Editar",
                            "teleconsulta:ver": "Teleconsulta · Ver",
                            "teleconsulta:editar": "Teleconsulta · Editar",
                            "bloco.mapa:ver": "Mapa de cirurgias · Ver",
                            "bloco.mapa:editar": "Mapa de cirurgias · Editar",
                            "bloco.marcar:ver": "Marcação de cirurgias · Ver",
                            "bloco.marcar:editar": "Marcação de cirurgias · Editar",
                            "bloco.registo:ver": "Registo cirúrgico · Ver",
                            "bloco.registo:editar": "Registo cirúrgico · Editar",
                            "acompanhamento:ver": "Acompanhamento · Ver",
                            "acompanhamento:editar": "Acompanhamento · Editar",
                            "comercial.propostas:ver": "Propostas · Ver",
                            "comercial.propostas:editar": "Propostas · Editar",
                            "comercial.descontos:ver": "Descontos · Ver",
                            "comercial.descontos:editar": "Descontos · Editar",
                            "financeiro.pagamentos:ver": "Pagamentos · Ver",
                            "financeiro.pagamentos:editar": "Pagamentos · Editar",
                            "financeiro.valores:ver": "Valores e comissões · Ver",
                            "financeiro.valores:editar": "Valores e comissões · Editar",
                            "stock:ver": "Stock · Ver",
                            "stock:editar": "Stock · Editar",
                            "documentos:ver": "Documentos · Ver",
                            "documentos:editar": "Documentos · Editar",
                            "conformidade:ver": "Conformidade · Ver",
                            "conformidade:editar": "Conformidade · Editar",
                            "equipa.tarefas:ver": "Tarefas · Ver",
                            "equipa.tarefas:editar": "Tarefas · Editar",
                            "equipa.chat:ver": "Conversas da equipa · Ver",
                            "equipa.chat:editar": "Conversas da equipa · Editar",
                            "indicadores.financeiros:ver": "Indicadores financeiros · Ver",
                            "indicadores.financeiros:editar": "Indicadores financeiros · Editar",
                            "indicadores.vendas:ver": "Indicadores de vendas · Ver",
                            "indicadores.vendas:editar": "Indicadores de vendas · Editar",
                            "indicadores.operacionais:ver": "Indicadores operacionais · Ver",
                            "indicadores.operacionais:editar": "Indicadores operacionais · Editar",
                            "indicadores.atendimento:ver": "Indicadores de atendimento · Ver",
                            "indicadores.atendimento:editar": "Indicadores de atendimento · Editar",
                            "site.cms:ver": "Site e conteúdos · Ver",
                            "site.cms:editar": "Site e conteúdos · Editar"
                        }
                    },
                    "limite_minuto": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Limite de pedidos por minuto",
                        "description": "Acima deste valor os pedidos são recusados temporariamente.",
                        "maximum": 6000,
                        "minimum": 10,
                        "default": 120
                    },
                    "expira_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válido até",
                        "description": "Opcional. Depois desta data o cliente deixa de funcionar."
                    },
                    "ip_permitidos": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Redes de origem permitidas",
                        "description": "Opcional. Um por linha: endereço ou rede.",
                        "maxLength": 2000
                    },
                    "origens": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Origens de navegador permitidas",
                        "description": "Só para integrações que correm num navegador. Uma por linha (https://exemplo.pt).",
                        "maxLength": 2000
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Responsável",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "justificacao_clinica": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Justificação clínica",
                        "description": "Obrigatória para autorizações com conteúdo clínico; precisa de aprovação da direção clínica.",
                        "maxLength": 4000
                    },
                    "justificacao_aprovada_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Aprovada por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "justificacao_aprovada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Aprovada em",
                        "readOnly": true
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "ultimo_uso_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Última utilização",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-clinico": false
            },
            "Recurso_api_clientes_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 500
                    },
                    "ambitos": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "clinico.parametros:ver",
                                "clinico.parametros:editar",
                                "ficha.identificacao:ver",
                                "ficha.identificacao:editar",
                                "ficha.consentimentos:ver",
                                "ficha.consentimentos:editar",
                                "ficha.clinica:ver",
                                "ficha.clinica:editar",
                                "ficha.captura:ver",
                                "ficha.captura:editar",
                                "ficha.fotografias:ver",
                                "ficha.fotografias:editar",
                                "ficha.plano:ver",
                                "ficha.plano:editar",
                                "crm.leads:ver",
                                "crm.leads:editar",
                                "crm.atendimento:ver",
                                "crm.atendimento:editar",
                                "crm.telefonia:ver",
                                "crm.telefonia:editar",
                                "crm.agente:ver",
                                "crm.agente:editar",
                                "marketing:ver",
                                "marketing:editar",
                                "agenda:ver",
                                "agenda:editar",
                                "teleconsulta:ver",
                                "teleconsulta:editar",
                                "bloco.mapa:ver",
                                "bloco.mapa:editar",
                                "bloco.marcar:ver",
                                "bloco.marcar:editar",
                                "bloco.registo:ver",
                                "bloco.registo:editar",
                                "acompanhamento:ver",
                                "acompanhamento:editar",
                                "comercial.propostas:ver",
                                "comercial.propostas:editar",
                                "comercial.descontos:ver",
                                "comercial.descontos:editar",
                                "financeiro.pagamentos:ver",
                                "financeiro.pagamentos:editar",
                                "financeiro.valores:ver",
                                "financeiro.valores:editar",
                                "stock:ver",
                                "stock:editar",
                                "documentos:ver",
                                "documentos:editar",
                                "conformidade:ver",
                                "conformidade:editar",
                                "equipa.tarefas:ver",
                                "equipa.tarefas:editar",
                                "equipa.chat:ver",
                                "equipa.chat:editar",
                                "indicadores.financeiros:ver",
                                "indicadores.financeiros:editar",
                                "indicadores.vendas:ver",
                                "indicadores.vendas:editar",
                                "indicadores.operacionais:ver",
                                "indicadores.operacionais:editar",
                                "indicadores.atendimento:ver",
                                "indicadores.atendimento:editar",
                                "site.cms:ver",
                                "site.cms:editar"
                            ]
                        },
                        "title": "Autorizações",
                        "description": "O que este cliente pode ver ou alterar, módulo a módulo.",
                        "x-enum-rotulos": {
                            "clinico.parametros:ver": "Parâmetros clínicos · Ver",
                            "clinico.parametros:editar": "Parâmetros clínicos · Editar",
                            "ficha.identificacao:ver": "Identificação do paciente · Ver",
                            "ficha.identificacao:editar": "Identificação do paciente · Editar",
                            "ficha.consentimentos:ver": "Consentimentos · Ver",
                            "ficha.consentimentos:editar": "Consentimentos · Editar",
                            "ficha.clinica:ver": "Ficha clínica · Ver",
                            "ficha.clinica:editar": "Ficha clínica · Editar",
                            "ficha.captura:ver": "Captura e tricoscopia · Ver",
                            "ficha.captura:editar": "Captura e tricoscopia · Editar",
                            "ficha.fotografias:ver": "Fotografias clínicas · Ver",
                            "ficha.fotografias:editar": "Fotografias clínicas · Editar",
                            "ficha.plano:ver": "Plano cirúrgico · Ver",
                            "ficha.plano:editar": "Plano cirúrgico · Editar",
                            "crm.leads:ver": "Leads e funil · Ver",
                            "crm.leads:editar": "Leads e funil · Editar",
                            "crm.atendimento:ver": "Atendimento · Ver",
                            "crm.atendimento:editar": "Atendimento · Editar",
                            "crm.telefonia:ver": "Telefonia · Ver",
                            "crm.telefonia:editar": "Telefonia · Editar",
                            "crm.agente:ver": "Agente de conversação · Ver",
                            "crm.agente:editar": "Agente de conversação · Editar",
                            "marketing:ver": "Marketing · Ver",
                            "marketing:editar": "Marketing · Editar",
                            "agenda:ver": "Agenda · Ver",
                            "agenda:editar": "Agenda · Editar",
                            "teleconsulta:ver": "Teleconsulta · Ver",
                            "teleconsulta:editar": "Teleconsulta · Editar",
                            "bloco.mapa:ver": "Mapa de cirurgias · Ver",
                            "bloco.mapa:editar": "Mapa de cirurgias · Editar",
                            "bloco.marcar:ver": "Marcação de cirurgias · Ver",
                            "bloco.marcar:editar": "Marcação de cirurgias · Editar",
                            "bloco.registo:ver": "Registo cirúrgico · Ver",
                            "bloco.registo:editar": "Registo cirúrgico · Editar",
                            "acompanhamento:ver": "Acompanhamento · Ver",
                            "acompanhamento:editar": "Acompanhamento · Editar",
                            "comercial.propostas:ver": "Propostas · Ver",
                            "comercial.propostas:editar": "Propostas · Editar",
                            "comercial.descontos:ver": "Descontos · Ver",
                            "comercial.descontos:editar": "Descontos · Editar",
                            "financeiro.pagamentos:ver": "Pagamentos · Ver",
                            "financeiro.pagamentos:editar": "Pagamentos · Editar",
                            "financeiro.valores:ver": "Valores e comissões · Ver",
                            "financeiro.valores:editar": "Valores e comissões · Editar",
                            "stock:ver": "Stock · Ver",
                            "stock:editar": "Stock · Editar",
                            "documentos:ver": "Documentos · Ver",
                            "documentos:editar": "Documentos · Editar",
                            "conformidade:ver": "Conformidade · Ver",
                            "conformidade:editar": "Conformidade · Editar",
                            "equipa.tarefas:ver": "Tarefas · Ver",
                            "equipa.tarefas:editar": "Tarefas · Editar",
                            "equipa.chat:ver": "Conversas da equipa · Ver",
                            "equipa.chat:editar": "Conversas da equipa · Editar",
                            "indicadores.financeiros:ver": "Indicadores financeiros · Ver",
                            "indicadores.financeiros:editar": "Indicadores financeiros · Editar",
                            "indicadores.vendas:ver": "Indicadores de vendas · Ver",
                            "indicadores.vendas:editar": "Indicadores de vendas · Editar",
                            "indicadores.operacionais:ver": "Indicadores operacionais · Ver",
                            "indicadores.operacionais:editar": "Indicadores operacionais · Editar",
                            "indicadores.atendimento:ver": "Indicadores de atendimento · Ver",
                            "indicadores.atendimento:editar": "Indicadores de atendimento · Editar",
                            "site.cms:ver": "Site e conteúdos · Ver",
                            "site.cms:editar": "Site e conteúdos · Editar"
                        }
                    },
                    "limite_minuto": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Limite de pedidos por minuto",
                        "description": "Acima deste valor os pedidos são recusados temporariamente.",
                        "maximum": 6000,
                        "minimum": 10,
                        "default": 120
                    },
                    "expira_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válido até",
                        "description": "Opcional. Depois desta data o cliente deixa de funcionar."
                    },
                    "ip_permitidos": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Redes de origem permitidas",
                        "description": "Opcional. Um por linha: endereço ou rede.",
                        "maxLength": 2000
                    },
                    "origens": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Origens de navegador permitidas",
                        "description": "Só para integrações que correm num navegador. Uma por linha (https://exemplo.pt).",
                        "maxLength": 2000
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Responsável",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "justificacao_clinica": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Justificação clínica",
                        "description": "Obrigatória para autorizações com conteúdo clínico; precisa de aprovação da direção clínica.",
                        "maxLength": 4000
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    }
                },
                "required": [
                    "nome",
                    "ambitos"
                ]
            },
            "Recurso_artigos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "referencia": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Referência",
                        "maxLength": 60
                    },
                    "categoria": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Categoria",
                        "enum": [
                            "consumivel",
                            "farmaco",
                            "material",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "consumivel": "Consumível",
                            "farmaco": "Fármaco",
                            "material": "Material",
                            "outro": "Outro"
                        },
                        "default": "consumivel"
                    },
                    "unidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Unidade",
                        "description": "Ex.: unidade, caixa, ml, frasco.",
                        "maxLength": 20,
                        "default": "un"
                    },
                    "stock_atual": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Stock atual",
                        "x-casas": 3,
                        "readOnly": true
                    },
                    "stock_minimo": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Stock mínimo",
                        "minimum": 0,
                        "x-casas": 3,
                        "default": 0
                    },
                    "stock_inicial": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Stock inicial",
                        "description": "Quantidade existente ao criar o artigo (fica registada como entrada).",
                        "minimum": 0,
                        "x-casas": 3
                    },
                    "custo_unitario": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Custo unitário",
                        "description": "Custo médio ponderado, atualizado a cada entrada com custo.",
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 4
                    },
                    "fornecedor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fornecedor habitual",
                        "maxLength": 160
                    },
                    "localizacao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Localização",
                        "maxLength": 80
                    },
                    "lote_obrigatorio": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Exige lote",
                        "description": "Os movimentos deste artigo têm de indicar o lote (e a validade).",
                        "default": 0
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 4000
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-clinico": false
            },
            "Recurso_artigos_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "referencia": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Referência",
                        "maxLength": 60
                    },
                    "categoria": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Categoria",
                        "enum": [
                            "consumivel",
                            "farmaco",
                            "material",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "consumivel": "Consumível",
                            "farmaco": "Fármaco",
                            "material": "Material",
                            "outro": "Outro"
                        },
                        "default": "consumivel"
                    },
                    "unidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Unidade",
                        "description": "Ex.: unidade, caixa, ml, frasco.",
                        "maxLength": 20,
                        "default": "un"
                    },
                    "stock_minimo": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Stock mínimo",
                        "minimum": 0,
                        "x-casas": 3,
                        "default": 0
                    },
                    "stock_inicial": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Stock inicial",
                        "description": "Quantidade existente ao criar o artigo (fica registada como entrada).",
                        "minimum": 0,
                        "x-casas": 3
                    },
                    "custo_unitario": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Custo unitário",
                        "description": "Custo médio ponderado, atualizado a cada entrada com custo.",
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 4
                    },
                    "fornecedor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fornecedor habitual",
                        "maxLength": 160
                    },
                    "localizacao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Localização",
                        "maxLength": 80
                    },
                    "lote_obrigatorio": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Exige lote",
                        "description": "Os movimentos deste artigo têm de indicar o lote (e a validade).",
                        "default": 0
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 4000
                    }
                },
                "required": [
                    "nome",
                    "categoria",
                    "unidade"
                ]
            },
            "Recurso_artigos_precos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "artigo_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Artigo",
                        "x-anagen-recurso": "artigos"
                    },
                    "fornecedor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fornecedor",
                        "maxLength": 160
                    },
                    "referencia_fornecedor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Referência do fornecedor",
                        "maxLength": 60
                    },
                    "preco": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Preço",
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 4
                    },
                    "unidade_compra": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Unidade de compra",
                        "maxLength": 30
                    },
                    "quantidade_minima": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Quantidade mínima",
                        "minimum": 0,
                        "x-casas": 3
                    },
                    "prazo_dias": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Prazo de entrega (dias)",
                        "maximum": 365,
                        "minimum": 0,
                        "x-unidade": "dias"
                    },
                    "valido_desde": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válido desde"
                    },
                    "valido_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válido até"
                    },
                    "preferido": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Preferido",
                        "default": 0
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-clinico": false
            },
            "Recurso_artigos_precos_Entrada": {
                "type": "object",
                "properties": {
                    "artigo_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Artigo",
                        "x-anagen-recurso": "artigos"
                    },
                    "fornecedor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fornecedor",
                        "maxLength": 160
                    },
                    "referencia_fornecedor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Referência do fornecedor",
                        "maxLength": 60
                    },
                    "preco": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Preço",
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 4
                    },
                    "unidade_compra": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Unidade de compra",
                        "maxLength": 30
                    },
                    "quantidade_minima": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Quantidade mínima",
                        "minimum": 0,
                        "x-casas": 3
                    },
                    "prazo_dias": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Prazo de entrega (dias)",
                        "maximum": 365,
                        "minimum": 0,
                        "x-unidade": "dias"
                    },
                    "valido_desde": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válido desde"
                    },
                    "valido_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válido até"
                    },
                    "preferido": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Preferido",
                        "default": 0
                    }
                },
                "required": [
                    "artigo_id",
                    "fornecedor",
                    "preco"
                ]
            },
            "Recurso_atividades_tratamento": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Atividade",
                        "maxLength": 200
                    },
                    "finalidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Finalidade",
                        "maxLength": 5000
                    },
                    "base_legal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fundamento jurídico",
                        "enum": [
                            "consentimento",
                            "prestacao_cuidados",
                            "contrato",
                            "interesse_legitimo",
                            "obrigacao_legal"
                        ],
                        "x-enum-rotulos": {
                            "consentimento": "Consentimento",
                            "prestacao_cuidados": "Prestação de cuidados de saúde",
                            "contrato": "Execução de contrato",
                            "interesse_legitimo": "Interesse legítimo",
                            "obrigacao_legal": "Obrigação legal"
                        }
                    },
                    "base_legal_detalhe": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fundamento (detalhe)",
                        "description": "Para dados de saúde, indique também a exceção do art. 9.º, n.º 2.",
                        "maxLength": 255
                    },
                    "categorias_dados": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "identificacao",
                                "contacto",
                                "saude",
                                "imagens",
                                "modelos_3d",
                                "gravacoes",
                                "financeiros",
                                "comportamento_site",
                                "profissionais"
                            ]
                        },
                        "title": "Categorias de dados",
                        "x-enum-rotulos": {
                            "identificacao": "Identificação",
                            "contacto": "Contactos",
                            "saude": "Dados de saúde",
                            "imagens": "Fotografias e imagens",
                            "modelos_3d": "Modelos 3D",
                            "gravacoes": "Gravações de voz e vídeo",
                            "financeiros": "Dados financeiros",
                            "comportamento_site": "Navegação no site",
                            "profissionais": "Dados de profissionais"
                        }
                    },
                    "titulares": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Categorias de titulares",
                        "maxLength": 255
                    },
                    "destinatarios": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Destinatários",
                        "maxLength": 5000
                    },
                    "subcontratantes": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "title": "Subcontratantes",
                        "x-anagen-recurso": "subcontratantes"
                    },
                    "transferencias": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Transferências internacionais",
                        "maxLength": 255
                    },
                    "prazo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Prazo de conservação",
                        "maxLength": 255
                    },
                    "medidas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Medidas de segurança",
                        "maxLength": 5000
                    },
                    "aipd_estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Avaliação de impacto",
                        "enum": [
                            "nao_necessaria",
                            "por_fazer",
                            "em_curso",
                            "feita"
                        ],
                        "x-enum-rotulos": {
                            "nao_necessaria": "Não necessária",
                            "por_fazer": "Por fazer",
                            "em_curso": "Em curso",
                            "feita": "Feita"
                        },
                        "default": "por_fazer"
                    },
                    "aipd_data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data da avaliação"
                    },
                    "modulo_sistema": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Módulo do sistema",
                        "maxLength": 60
                    },
                    "dispositivo_medico": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Software como dispositivo médico",
                        "description": "Avaliação nos termos do Regulamento (UE) 2017/745 para funcionalidades com finalidade médica (por exemplo, análise de imagem).",
                        "enum": [
                            "nao_aplicavel",
                            "por_avaliar",
                            "nao",
                            "sim"
                        ],
                        "x-enum-rotulos": {
                            "nao_aplicavel": "Não aplicável",
                            "por_avaliar": "Por avaliar",
                            "nao": "Não é dispositivo médico",
                            "sim": "É dispositivo médico"
                        },
                        "default": "nao_aplicavel"
                    },
                    "revisto_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Revisto em",
                        "readOnly": true
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    },
                    "revisao_juridica": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Revisto pelo encarregado/jurídico",
                        "description": "Marque depois de o encarregado de proteção de dados ou o jurídico rever o texto. Os textos fornecidos com o sistema chegam por rever."
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-clinico": false
            },
            "Recurso_atividades_tratamento_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Atividade",
                        "maxLength": 200
                    },
                    "finalidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Finalidade",
                        "maxLength": 5000
                    },
                    "base_legal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fundamento jurídico",
                        "enum": [
                            "consentimento",
                            "prestacao_cuidados",
                            "contrato",
                            "interesse_legitimo",
                            "obrigacao_legal"
                        ],
                        "x-enum-rotulos": {
                            "consentimento": "Consentimento",
                            "prestacao_cuidados": "Prestação de cuidados de saúde",
                            "contrato": "Execução de contrato",
                            "interesse_legitimo": "Interesse legítimo",
                            "obrigacao_legal": "Obrigação legal"
                        }
                    },
                    "base_legal_detalhe": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fundamento (detalhe)",
                        "description": "Para dados de saúde, indique também a exceção do art. 9.º, n.º 2.",
                        "maxLength": 255
                    },
                    "categorias_dados": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "identificacao",
                                "contacto",
                                "saude",
                                "imagens",
                                "modelos_3d",
                                "gravacoes",
                                "financeiros",
                                "comportamento_site",
                                "profissionais"
                            ]
                        },
                        "title": "Categorias de dados",
                        "x-enum-rotulos": {
                            "identificacao": "Identificação",
                            "contacto": "Contactos",
                            "saude": "Dados de saúde",
                            "imagens": "Fotografias e imagens",
                            "modelos_3d": "Modelos 3D",
                            "gravacoes": "Gravações de voz e vídeo",
                            "financeiros": "Dados financeiros",
                            "comportamento_site": "Navegação no site",
                            "profissionais": "Dados de profissionais"
                        }
                    },
                    "titulares": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Categorias de titulares",
                        "maxLength": 255
                    },
                    "destinatarios": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Destinatários",
                        "maxLength": 5000
                    },
                    "subcontratantes": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "title": "Subcontratantes",
                        "x-anagen-recurso": "subcontratantes"
                    },
                    "transferencias": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Transferências internacionais",
                        "maxLength": 255
                    },
                    "prazo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Prazo de conservação",
                        "maxLength": 255
                    },
                    "medidas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Medidas de segurança",
                        "maxLength": 5000
                    },
                    "aipd_estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Avaliação de impacto",
                        "enum": [
                            "nao_necessaria",
                            "por_fazer",
                            "em_curso",
                            "feita"
                        ],
                        "x-enum-rotulos": {
                            "nao_necessaria": "Não necessária",
                            "por_fazer": "Por fazer",
                            "em_curso": "Em curso",
                            "feita": "Feita"
                        },
                        "default": "por_fazer"
                    },
                    "aipd_data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data da avaliação"
                    },
                    "modulo_sistema": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Módulo do sistema",
                        "maxLength": 60
                    },
                    "dispositivo_medico": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Software como dispositivo médico",
                        "description": "Avaliação nos termos do Regulamento (UE) 2017/745 para funcionalidades com finalidade médica (por exemplo, análise de imagem).",
                        "enum": [
                            "nao_aplicavel",
                            "por_avaliar",
                            "nao",
                            "sim"
                        ],
                        "x-enum-rotulos": {
                            "nao_aplicavel": "Não aplicável",
                            "por_avaliar": "Por avaliar",
                            "nao": "Não é dispositivo médico",
                            "sim": "É dispositivo médico"
                        },
                        "default": "nao_aplicavel"
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    },
                    "revisao_juridica": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Revisto pelo encarregado/jurídico",
                        "description": "Marque depois de o encarregado de proteção de dados ou o jurídico rever o texto. Os textos fornecidos com o sistema chegam por rever."
                    }
                },
                "required": [
                    "nome",
                    "finalidade",
                    "base_legal"
                ]
            },
            "Recurso_ausencias": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Pessoa",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "recurso_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Sala ou equipamento",
                        "x-anagen-recurso": "recursos_agenda"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "ferias",
                            "formacao",
                            "doenca",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "ferias": "Férias",
                            "formacao": "Formação",
                            "doenca": "Doença",
                            "outro": "Ausência"
                        },
                        "default": "ferias"
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Início"
                    },
                    "fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Fim"
                    },
                    "aprovada": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Aprovada",
                        "description": "Só as ausências aprovadas bloqueiam a agenda.",
                        "default": 1
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "description": "Sem motivos clínicos.",
                        "maxLength": 255
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-clinico": false
            },
            "Recurso_ausencias_Entrada": {
                "type": "object",
                "properties": {
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Pessoa",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "recurso_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Sala ou equipamento",
                        "x-anagen-recurso": "recursos_agenda"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "ferias",
                            "formacao",
                            "doenca",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "ferias": "Férias",
                            "formacao": "Formação",
                            "doenca": "Doença",
                            "outro": "Ausência"
                        },
                        "default": "ferias"
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Início"
                    },
                    "fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Fim"
                    },
                    "aprovada": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Aprovada",
                        "description": "Só as ausências aprovadas bloqueiam a agenda.",
                        "default": 1
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "description": "Sem motivos clínicos.",
                        "maxLength": 255
                    }
                },
                "required": [
                    "tipo",
                    "inicio",
                    "fim"
                ]
            },
            "Recurso_avisos_exibicoes": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "mostrado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Mostrado em",
                        "readOnly": true
                    },
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal",
                        "enum": [
                            "site",
                            "portal",
                            "agente_voz",
                            "teleconsulta",
                            "app",
                            "formulario",
                            "presencial",
                            "demonstracao"
                        ],
                        "x-enum-rotulos": {
                            "site": "Site",
                            "portal": "Portal do paciente",
                            "agente_voz": "Agente de voz",
                            "teleconsulta": "Teleconsulta",
                            "app": "Aplicação móvel",
                            "formulario": "Formulários",
                            "presencial": "Presencial",
                            "demonstracao": "Pedido de demonstração"
                        },
                        "readOnly": true
                    },
                    "aviso_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Aviso",
                        "x-anagen-recurso": "avisos_privacidade",
                        "readOnly": true
                    },
                    "aviso_versao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Versão",
                        "readOnly": true
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "contexto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Onde",
                        "enum": [
                            "pre_avaliacao",
                            "contacto_chamada",
                            "contacto_marcacao",
                            "contacto_reclamacao",
                            "portal_registo",
                            "portal",
                            "demonstracao",
                            "formulario",
                            "teleconsulta",
                            "agente_voz",
                            "recolha",
                            "app"
                        ],
                        "x-enum-rotulos": {
                            "pre_avaliacao": "Pré-avaliação",
                            "contacto_chamada": "Pedido de chamada",
                            "contacto_marcacao": "Pedido de marcação",
                            "contacto_reclamacao": "Reclamação, elogio ou sugestão",
                            "portal_registo": "Registo no portal",
                            "portal": "Portal do paciente",
                            "demonstracao": "Pedido de demonstração",
                            "formulario": "Formulário enviado por ligação",
                            "teleconsulta": "Teleconsulta",
                            "agente_voz": "Atendimento pelo agente de voz",
                            "recolha": "Recolha de consentimentos",
                            "app": "Aplicação"
                        },
                        "readOnly": true
                    },
                    "meio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Meio",
                        "enum": [
                            "web",
                            "app",
                            "externo",
                            "voz",
                            "video",
                            "presencial",
                            "api"
                        ],
                        "x-enum-rotulos": {
                            "web": "Site",
                            "app": "Aplicação",
                            "externo": "Site externo",
                            "voz": "Chamada",
                            "video": "Vídeo",
                            "presencial": "Presencial",
                            "api": "Integração"
                        },
                        "readOnly": true
                    },
                    "prova": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Prova",
                        "enum": [
                            "testemunho",
                            "envio",
                            "servidor"
                        ],
                        "x-enum-rotulos": {
                            "testemunho": "Versão confirmada pelo formulário",
                            "envio": "Versão em vigor no envio",
                            "servidor": "Mostrado pelo próprio fluxo"
                        },
                        "readOnly": true
                    },
                    "titular_tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Titular",
                        "enum": [
                            "paciente",
                            "lead",
                            "portal_conta",
                            "contacto"
                        ],
                        "x-enum-rotulos": {
                            "paciente": "Paciente",
                            "lead": "Contacto comercial",
                            "portal_conta": "Conta do portal",
                            "contacto": "Contacto"
                        },
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes",
                        "readOnly": true
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Contacto",
                        "x-anagen-recurso": "leads",
                        "readOnly": true
                    },
                    "portal_conta_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Conta do portal",
                        "readOnly": true
                    },
                    "ref_tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Registo ligado",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "ref_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "N.º do registo",
                        "readOnly": true
                    },
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Mostrado por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "registado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Registado em",
                        "readOnly": true
                    },
                    "texto_hash": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resumo do texto do aviso (SHA-256)",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "impressao_digital": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Impressão digital do registo",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-clinico": false
            },
            "Recurso_avisos_exibicoes_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_avisos_privacidade": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal",
                        "enum": [
                            "site",
                            "portal",
                            "agente_voz",
                            "teleconsulta",
                            "app",
                            "formulario",
                            "presencial",
                            "demonstracao"
                        ],
                        "x-enum-rotulos": {
                            "site": "Site",
                            "portal": "Portal do paciente",
                            "agente_voz": "Agente de voz",
                            "teleconsulta": "Teleconsulta",
                            "app": "Aplicação móvel",
                            "formulario": "Formulários",
                            "presencial": "Presencial",
                            "demonstracao": "Pedido de demonstração"
                        }
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 200
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português (Portugal)",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        },
                        "default": "pt-PT"
                    },
                    "texto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Texto",
                        "description": "Responsável, encarregado, finalidades, fundamentos, destinatários, prazos de conservação e direitos — com os dados legais da clínica."
                    },
                    "versao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Versão",
                        "readOnly": true
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Em vigor",
                        "readOnly": true
                    },
                    "publicado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Publicado em",
                        "readOnly": true
                    },
                    "publicado_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Publicado por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "revisao_juridica": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Revisto pelo encarregado/jurídico",
                        "description": "Marque depois de o encarregado de proteção de dados ou o jurídico rever o texto. Os textos fornecidos com o sistema chegam por rever."
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-clinico": false
            },
            "Recurso_avisos_privacidade_Entrada": {
                "type": "object",
                "properties": {
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal",
                        "enum": [
                            "site",
                            "portal",
                            "agente_voz",
                            "teleconsulta",
                            "app",
                            "formulario",
                            "presencial",
                            "demonstracao"
                        ],
                        "x-enum-rotulos": {
                            "site": "Site",
                            "portal": "Portal do paciente",
                            "agente_voz": "Agente de voz",
                            "teleconsulta": "Teleconsulta",
                            "app": "Aplicação móvel",
                            "formulario": "Formulários",
                            "presencial": "Presencial",
                            "demonstracao": "Pedido de demonstração"
                        }
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 200
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português (Portugal)",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        },
                        "default": "pt-PT"
                    },
                    "texto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Texto",
                        "description": "Responsável, encarregado, finalidades, fundamentos, destinatários, prazos de conservação e direitos — com os dados legais da clínica."
                    },
                    "revisao_juridica": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Revisto pelo encarregado/jurídico",
                        "description": "Marque depois de o encarregado de proteção de dados ou o jurídico rever o texto. Os textos fornecidos com o sistema chegam por rever."
                    }
                },
                "required": [
                    "canal",
                    "titulo",
                    "idioma",
                    "texto"
                ]
            },
            "Recurso_base_conhecimento": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 190
                    },
                    "categoria": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Categoria",
                        "enum": [
                            "horario",
                            "localizacao",
                            "consulta",
                            "procedimentos",
                            "pos_operatorio",
                            "pagamentos",
                            "geral",
                            "correcao"
                        ],
                        "x-enum-rotulos": {
                            "horario": "Horário",
                            "localizacao": "Localização",
                            "consulta": "Consulta",
                            "procedimentos": "Procedimentos",
                            "pos_operatorio": "Pós-operatório",
                            "pagamentos": "Pagamentos",
                            "geral": "Geral",
                            "correcao": "Correção da equipa"
                        },
                        "default": "geral"
                    },
                    "corpo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Texto",
                        "maxLength": 20000
                    },
                    "publico": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Para",
                        "enum": [
                            "interno",
                            "agente",
                            "paciente"
                        ],
                        "x-enum-rotulos": {
                            "interno": "Só a equipa",
                            "agente": "Agente e assistentes",
                            "paciente": "Pacientes"
                        },
                        "default": "agente"
                    },
                    "perfis": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "administracao",
                                "medico",
                                "enfermagem",
                                "tecnico",
                                "comercial",
                                "rececao"
                            ]
                        },
                        "title": "Perfis",
                        "x-enum-rotulos": {
                            "administracao": "Administração",
                            "medico": "Médico",
                            "enfermagem": "Enfermagem",
                            "tecnico": "Técnico",
                            "comercial": "Comercial",
                            "rececao": "Receção"
                        }
                    },
                    "clinico": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Conteúdo clínico",
                        "description": "Conteúdo clínico só é aprovado pela direção clínica."
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        },
                        "default": "pt-PT"
                    },
                    "palavras": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Palavras-chave",
                        "maxLength": 255
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "rascunho",
                            "aprovado",
                            "arquivado"
                        ],
                        "x-enum-rotulos": {
                            "rascunho": "Rascunho",
                            "aprovado": "Aprovado",
                            "arquivado": "Arquivado"
                        },
                        "readOnly": true
                    },
                    "versao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Versão",
                        "readOnly": true
                    },
                    "aprovado_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Aprovado por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "aprovado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Aprovado em",
                        "readOnly": true
                    },
                    "origem_correcao_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Correção de",
                        "x-anagen-recurso": "agente_pedidos",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "crm.agente",
                "x-anagen-clinico": false
            },
            "Recurso_base_conhecimento_Entrada": {
                "type": "object",
                "properties": {
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 190
                    },
                    "categoria": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Categoria",
                        "enum": [
                            "horario",
                            "localizacao",
                            "consulta",
                            "procedimentos",
                            "pos_operatorio",
                            "pagamentos",
                            "geral",
                            "correcao"
                        ],
                        "x-enum-rotulos": {
                            "horario": "Horário",
                            "localizacao": "Localização",
                            "consulta": "Consulta",
                            "procedimentos": "Procedimentos",
                            "pos_operatorio": "Pós-operatório",
                            "pagamentos": "Pagamentos",
                            "geral": "Geral",
                            "correcao": "Correção da equipa"
                        },
                        "default": "geral"
                    },
                    "corpo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Texto",
                        "maxLength": 20000
                    },
                    "publico": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Para",
                        "enum": [
                            "interno",
                            "agente",
                            "paciente"
                        ],
                        "x-enum-rotulos": {
                            "interno": "Só a equipa",
                            "agente": "Agente e assistentes",
                            "paciente": "Pacientes"
                        },
                        "default": "agente"
                    },
                    "perfis": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "administracao",
                                "medico",
                                "enfermagem",
                                "tecnico",
                                "comercial",
                                "rececao"
                            ]
                        },
                        "title": "Perfis",
                        "x-enum-rotulos": {
                            "administracao": "Administração",
                            "medico": "Médico",
                            "enfermagem": "Enfermagem",
                            "tecnico": "Técnico",
                            "comercial": "Comercial",
                            "rececao": "Receção"
                        }
                    },
                    "clinico": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Conteúdo clínico",
                        "description": "Conteúdo clínico só é aprovado pela direção clínica."
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        },
                        "default": "pt-PT"
                    },
                    "palavras": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Palavras-chave",
                        "maxLength": 255
                    }
                },
                "required": [
                    "titulo",
                    "categoria",
                    "corpo",
                    "publico"
                ]
            },
            "Recurso_caixas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data",
                        "readOnly": true
                    },
                    "local_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Local",
                        "x-anagen-recurso": "locais",
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "aberta",
                            "fechada"
                        ],
                        "x-enum-rotulos": {
                            "aberta": "Aberta",
                            "fechada": "Fechada"
                        },
                        "readOnly": true
                    },
                    "saldo_inicial": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Saldo inicial",
                        "x-moeda": "EUR",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "total_numerario": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Numerário",
                        "x-moeda": "EUR",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "total_cartao": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Cartão",
                        "x-moeda": "EUR",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "total_outros": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Outros métodos",
                        "x-moeda": "EUR",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "contado": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Contado",
                        "x-moeda": "EUR",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "diferenca": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Diferença",
                        "x-moeda": "EUR",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "aberta_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Aberta por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "aberta_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Aberta em",
                        "readOnly": true
                    },
                    "fechada_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Fechada por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "fechada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Fechada em",
                        "readOnly": true
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-clinico": false
            },
            "Recurso_caixas_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_campanhas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal",
                        "enum": [
                            "email",
                            "sms",
                            "whatsapp"
                        ],
                        "x-enum-rotulos": {
                            "email": "Email",
                            "sms": "SMS",
                            "whatsapp": "WhatsApp"
                        },
                        "default": "email"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "informacao",
                            "novidade",
                            "evento",
                            "avaliacao",
                            "reativacao",
                            "data_especial"
                        ],
                        "x-enum-rotulos": {
                            "informacao": "Informação",
                            "novidade": "Novidade",
                            "evento": "Evento",
                            "avaliacao": "Pedido de avaliação",
                            "reativacao": "Reativação",
                            "data_especial": "Data especial"
                        },
                        "default": "informacao"
                    },
                    "finalidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Finalidade",
                        "description": "Comercial: só a quem consentiu (ou exceção de cliente). Serviço: sem promoções.",
                        "enum": [
                            "marketing",
                            "servico"
                        ],
                        "x-enum-rotulos": {
                            "marketing": "Comunicação comercial",
                            "servico": "Comunicação de serviço"
                        },
                        "default": "marketing"
                    },
                    "segmento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Segmento",
                        "x-anagen-recurso": "segmentos"
                    },
                    "assunto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Assunto",
                        "maxLength": 190
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "rascunho",
                            "em_aprovacao",
                            "aprovada",
                            "agendada",
                            "a_enviar",
                            "enviada",
                            "cancelada"
                        ],
                        "x-enum-rotulos": {
                            "rascunho": "Rascunho",
                            "em_aprovacao": "Em aprovação clínica",
                            "aprovada": "Aprovada",
                            "agendada": "Agendada",
                            "a_enviar": "A enviar",
                            "enviada": "Enviada",
                            "cancelada": "Cancelada"
                        },
                        "readOnly": true
                    },
                    "agendada_para": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Envio agendado",
                        "readOnly": true
                    },
                    "enviada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Enviada em",
                        "readOnly": true
                    },
                    "total": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Público",
                        "readOnly": true
                    },
                    "entregues": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Entregues",
                        "readOnly": true
                    },
                    "cliques": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Cliques",
                        "readOnly": true
                    },
                    "anulacoes": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Anulações",
                        "readOnly": true
                    },
                    "conversoes": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Conversões",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-clinico": false
            },
            "Recurso_campanhas_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal",
                        "enum": [
                            "email",
                            "sms",
                            "whatsapp"
                        ],
                        "x-enum-rotulos": {
                            "email": "Email",
                            "sms": "SMS",
                            "whatsapp": "WhatsApp"
                        },
                        "default": "email"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "informacao",
                            "novidade",
                            "evento",
                            "avaliacao",
                            "reativacao",
                            "data_especial"
                        ],
                        "x-enum-rotulos": {
                            "informacao": "Informação",
                            "novidade": "Novidade",
                            "evento": "Evento",
                            "avaliacao": "Pedido de avaliação",
                            "reativacao": "Reativação",
                            "data_especial": "Data especial"
                        },
                        "default": "informacao"
                    },
                    "finalidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Finalidade",
                        "description": "Comercial: só a quem consentiu (ou exceção de cliente). Serviço: sem promoções.",
                        "enum": [
                            "marketing",
                            "servico"
                        ],
                        "x-enum-rotulos": {
                            "marketing": "Comunicação comercial",
                            "servico": "Comunicação de serviço"
                        },
                        "default": "marketing"
                    },
                    "segmento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Segmento",
                        "x-anagen-recurso": "segmentos"
                    },
                    "assunto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Assunto",
                        "maxLength": 190
                    }
                },
                "required": [
                    "nome",
                    "canal",
                    "tipo",
                    "finalidade"
                ]
            },
            "Recurso_campanhas_chamadas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "reativacao",
                            "confirmacoes",
                            "lembretes",
                            "propostas_paradas",
                            "pos_operatorio",
                            "leads_fase"
                        ],
                        "x-enum-rotulos": {
                            "reativacao": "Reativação",
                            "confirmacoes": "Confirmações",
                            "lembretes": "Lembretes",
                            "propostas_paradas": "Propostas paradas",
                            "pos_operatorio": "Pós-operatório",
                            "leads_fase": "Leads de uma fase"
                        },
                        "default": "reativacao"
                    },
                    "filtro": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Filtro",
                        "description": "Ex.: {\"dias\": 60} (reativação e confirmações), {\"fase_id\": 5, \"origem\": \"site\"} (leads de uma fase)."
                    },
                    "guiao_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Guião",
                        "x-anagen-recurso": "guioes"
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "rascunho",
                            "ativa",
                            "pausada",
                            "concluida"
                        ],
                        "x-enum-rotulos": {
                            "rascunho": "Rascunho",
                            "ativa": "Ativa",
                            "pausada": "Pausada",
                            "concluida": "Concluída"
                        },
                        "readOnly": true,
                        "default": "rascunho"
                    },
                    "total": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Contactos",
                        "readOnly": true
                    },
                    "concluidos": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Concluídos",
                        "readOnly": true
                    },
                    "bloqueados": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Bloqueados",
                        "description": "Sem consentimento para chamadas comerciais ou na lista de oposição.",
                        "readOnly": true
                    },
                    "gerada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Gerada em",
                        "readOnly": true
                    },
                    "executor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Quem liga",
                        "description": "O agente de voz liga pela central da clínica, com as mesmas regras do marcador.",
                        "enum": [
                            "pessoa",
                            "agente"
                        ],
                        "x-enum-rotulos": {
                            "pessoa": "Uma pessoa (marcador)",
                            "agente": "Agente de voz"
                        },
                        "default": "pessoa"
                    },
                    "janela_inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{2}:\\d{2}$",
                        "title": "O agente liga a partir de",
                        "description": "Vazio: o horário da clínica."
                    },
                    "janela_fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{2}:\\d{2}$",
                        "title": "O agente liga até"
                    },
                    "numero_saida": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Número que aparece a quem atende",
                        "description": "Vazio: o primeiro número da clínica."
                    },
                    "lingua": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua das chamadas",
                        "description": "Vazio: a língua de cada pessoa.",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        }
                    },
                    "max_simultaneas": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Chamadas em simultâneo",
                        "maximum": 20,
                        "minimum": 1,
                        "default": 2
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-clinico": false
            },
            "Recurso_campanhas_chamadas_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "reativacao",
                            "confirmacoes",
                            "lembretes",
                            "propostas_paradas",
                            "pos_operatorio",
                            "leads_fase"
                        ],
                        "x-enum-rotulos": {
                            "reativacao": "Reativação",
                            "confirmacoes": "Confirmações",
                            "lembretes": "Lembretes",
                            "propostas_paradas": "Propostas paradas",
                            "pos_operatorio": "Pós-operatório",
                            "leads_fase": "Leads de uma fase"
                        },
                        "default": "reativacao"
                    },
                    "filtro": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Filtro",
                        "description": "Ex.: {\"dias\": 60} (reativação e confirmações), {\"fase_id\": 5, \"origem\": \"site\"} (leads de uma fase)."
                    },
                    "guiao_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Guião",
                        "x-anagen-recurso": "guioes"
                    },
                    "executor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Quem liga",
                        "description": "O agente de voz liga pela central da clínica, com as mesmas regras do marcador.",
                        "enum": [
                            "pessoa",
                            "agente"
                        ],
                        "x-enum-rotulos": {
                            "pessoa": "Uma pessoa (marcador)",
                            "agente": "Agente de voz"
                        },
                        "default": "pessoa"
                    },
                    "janela_inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{2}:\\d{2}$",
                        "title": "O agente liga a partir de",
                        "description": "Vazio: o horário da clínica."
                    },
                    "janela_fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{2}:\\d{2}$",
                        "title": "O agente liga até"
                    },
                    "numero_saida": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Número que aparece a quem atende",
                        "description": "Vazio: o primeiro número da clínica."
                    },
                    "lingua": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua das chamadas",
                        "description": "Vazio: a língua de cada pessoa.",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        }
                    },
                    "max_simultaneas": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Chamadas em simultâneo",
                        "maximum": 20,
                        "minimum": 1,
                        "default": 2
                    }
                },
                "required": [
                    "nome",
                    "tipo"
                ]
            },
            "Recurso_capturas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "avaliacao",
                            "pre_operatorio",
                            "cirurgia",
                            "seguimento"
                        ],
                        "x-enum-rotulos": {
                            "avaliacao": "Avaliação",
                            "pre_operatorio": "Pré-operatório",
                            "cirurgia": "Cirurgia (dia 0)",
                            "seguimento": "Seguimento"
                        },
                        "default": "avaliacao"
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Data"
                    },
                    "protocolo_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Protocolo",
                        "x-anagen-recurso": "protocolos_foto"
                    },
                    "marco_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Marco",
                        "x-anagen-recurso": "marcos_acompanhamento"
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Episódio",
                        "minimum": 1
                    },
                    "qualidade_pontuacao": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Pontuação de qualidade",
                        "x-casas": 1,
                        "readOnly": true
                    },
                    "qualidade_ok": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Qualidade suficiente",
                        "readOnly": true
                    },
                    "cobertura_ok": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Cobertura suficiente",
                        "readOnly": true
                    },
                    "escala_ok": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Escala confirmada",
                        "readOnly": true
                    },
                    "repetir": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Repetir"
                    },
                    "repetir_motivo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo da repetição",
                        "maxLength": 255
                    },
                    "realizada_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Realizada por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas clínicas",
                        "maxLength": 4000,
                        "x-anagen-cifrado": "clinico"
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-clinico": true
            },
            "Recurso_capturas_Entrada": {
                "type": "object",
                "properties": {
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "avaliacao",
                            "pre_operatorio",
                            "cirurgia",
                            "seguimento"
                        ],
                        "x-enum-rotulos": {
                            "avaliacao": "Avaliação",
                            "pre_operatorio": "Pré-operatório",
                            "cirurgia": "Cirurgia (dia 0)",
                            "seguimento": "Seguimento"
                        },
                        "default": "avaliacao"
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Data"
                    },
                    "protocolo_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Protocolo",
                        "x-anagen-recurso": "protocolos_foto"
                    },
                    "marco_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Marco",
                        "x-anagen-recurso": "marcos_acompanhamento"
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Episódio",
                        "minimum": 1
                    },
                    "repetir": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Repetir"
                    },
                    "repetir_motivo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo da repetição",
                        "maxLength": 255
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas clínicas",
                        "maxLength": 4000,
                        "x-anagen-cifrado": "clinico"
                    }
                },
                "required": [
                    "paciente_id",
                    "tipo",
                    "data"
                ]
            },
            "Recurso_casos_publicados": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 200
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt",
                            "en"
                        ],
                        "x-enum-rotulos": "Português",
                        "default": "pt"
                    },
                    "procedimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Procedimento (n.º)",
                        "description": "Número do procedimento no catálogo.",
                        "minimum": 1
                    },
                    "resumo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resumo",
                        "maxLength": 300
                    },
                    "imagens": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Imagens",
                        "description": "Lista no formato [{\"id\": 12, \"legenda\": \"Antes\"}, {\"id\": 13, \"legenda\": \"12 meses\"}] com ids da biblioteca de marketing."
                    },
                    "texto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Texto"
                    },
                    "publicado": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Publicado",
                        "default": 0
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 9999,
                        "minimum": 0,
                        "default": 0
                    },
                    "consentimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Consentimento (n.º)",
                        "description": "Preenchido a partir das imagens.",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-clinico": false
            },
            "Recurso_casos_publicados_Entrada": {
                "type": "object",
                "properties": {
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 200
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt",
                            "en"
                        ],
                        "x-enum-rotulos": "Português",
                        "default": "pt"
                    },
                    "procedimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Procedimento (n.º)",
                        "description": "Número do procedimento no catálogo.",
                        "minimum": 1
                    },
                    "resumo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resumo",
                        "maxLength": 300
                    },
                    "imagens": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Imagens",
                        "description": "Lista no formato [{\"id\": 12, \"legenda\": \"Antes\"}, {\"id\": 13, \"legenda\": \"12 meses\"}] com ids da biblioteca de marketing."
                    },
                    "texto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Texto"
                    },
                    "publicado": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Publicado",
                        "default": 0
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 9999,
                        "minimum": 0,
                        "default": 0
                    }
                },
                "required": [
                    "titulo",
                    "idioma",
                    "imagens"
                ]
            },
            "Recurso_chamadas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "direcao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Sentido",
                        "enum": [
                            "entrada",
                            "saida"
                        ],
                        "x-enum-rotulos": {
                            "entrada": "Recebida",
                            "saida": "Efetuada"
                        },
                        "default": "saida"
                    },
                    "numero": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Número"
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "atendida",
                            "perdida",
                            "fora_horas",
                            "correio_voz",
                            "ocupado"
                        ],
                        "x-enum-rotulos": {
                            "atendida": "Atendida",
                            "perdida": "Perdida",
                            "fora_horas": "Fora de horas",
                            "correio_voz": "Correio de voz",
                            "ocupado": "Ocupado"
                        },
                        "default": "atendida"
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Início"
                    },
                    "duracao_s": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Duração",
                        "minimum": 0,
                        "x-unidade": "s"
                    },
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Atendida por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Lead",
                        "x-anagen-recurso": "leads"
                    },
                    "resultado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resultado",
                        "enum": [
                            "marcou_consulta",
                            "interessado",
                            "ligar_mais_tarde",
                            "sem_interesse",
                            "nao_atendeu",
                            "numero_errado",
                            "pediu_nao_contactar",
                            "confirmou",
                            "remarcou",
                            "cancelou",
                            "acompanhamento_feito"
                        ],
                        "x-enum-rotulos": {
                            "marcou_consulta": "Marcou consulta",
                            "interessado": "Interessado",
                            "ligar_mais_tarde": "Ligar mais tarde",
                            "sem_interesse": "Sem interesse",
                            "nao_atendeu": "Não atendeu",
                            "numero_errado": "Número errado",
                            "pediu_nao_contactar": "Pediu para não ser contactado",
                            "confirmou": "Confirmou",
                            "remarcou": "Remarcou",
                            "cancelou": "Cancelou",
                            "acompanhamento_feito": "Acompanhamento feito"
                        }
                    },
                    "devolvida_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Devolvida em",
                        "readOnly": true
                    },
                    "pontuacao_guiao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Pontuação face ao guião",
                        "readOnly": true
                    },
                    "gravacao_consentida": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Gravação aceite",
                        "readOnly": true
                    },
                    "gravacao_ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Gravação",
                        "readOnly": true
                    },
                    "resumo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resumo",
                        "x-anagen-cifrado": "geral",
                        "readOnly": true
                    },
                    "transcricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Transcrição",
                        "x-anagen-permissao": "ficha.clinica",
                        "x-anagen-cifrado": "geral",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-clinico": false
            },
            "Recurso_chamadas_Entrada": {
                "type": "object",
                "properties": {
                    "direcao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Sentido",
                        "enum": [
                            "entrada",
                            "saida"
                        ],
                        "x-enum-rotulos": {
                            "entrada": "Recebida",
                            "saida": "Efetuada"
                        },
                        "default": "saida"
                    },
                    "numero": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Número"
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "atendida",
                            "perdida",
                            "fora_horas",
                            "correio_voz",
                            "ocupado"
                        ],
                        "x-enum-rotulos": {
                            "atendida": "Atendida",
                            "perdida": "Perdida",
                            "fora_horas": "Fora de horas",
                            "correio_voz": "Correio de voz",
                            "ocupado": "Ocupado"
                        },
                        "default": "atendida"
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Início"
                    },
                    "duracao_s": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Duração",
                        "minimum": 0,
                        "x-unidade": "s"
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Lead",
                        "x-anagen-recurso": "leads"
                    },
                    "resultado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resultado",
                        "enum": [
                            "marcou_consulta",
                            "interessado",
                            "ligar_mais_tarde",
                            "sem_interesse",
                            "nao_atendeu",
                            "numero_errado",
                            "pediu_nao_contactar",
                            "confirmou",
                            "remarcou",
                            "cancelou",
                            "acompanhamento_feito"
                        ],
                        "x-enum-rotulos": {
                            "marcou_consulta": "Marcou consulta",
                            "interessado": "Interessado",
                            "ligar_mais_tarde": "Ligar mais tarde",
                            "sem_interesse": "Sem interesse",
                            "nao_atendeu": "Não atendeu",
                            "numero_errado": "Número errado",
                            "pediu_nao_contactar": "Pediu para não ser contactado",
                            "confirmou": "Confirmou",
                            "remarcou": "Remarcou",
                            "cancelou": "Cancelou",
                            "acompanhamento_feito": "Acompanhamento feito"
                        }
                    }
                },
                "required": [
                    "direcao",
                    "numero",
                    "estado",
                    "inicio"
                ]
            },
            "Recurso_checklist_modelos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "fase": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fase",
                        "enum": [
                            "pre_operatorio",
                            "admissao",
                            "desenho",
                            "anestesia",
                            "extracao",
                            "implantacao",
                            "penso",
                            "alta"
                        ],
                        "x-enum-rotulos": {
                            "pre_operatorio": "Pré-operatório",
                            "admissao": "Admissão",
                            "desenho": "Desenho",
                            "anestesia": "Anestesia",
                            "extracao": "Extração",
                            "implantacao": "Implantação",
                            "penso": "Penso",
                            "alta": "Alta"
                        }
                    },
                    "chave": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Chave",
                        "maxLength": 40,
                        "pattern": "/^[a-z0-9_]{2,40}$/"
                    },
                    "itens_texto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Itens",
                        "description": "Um item por linha. Comece com «(opcional)» para itens não obrigatórios e termine com [enfermeiro], [cirurgiao], [tecnico]… para indicar o responsável.",
                        "maxLength": 12000
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 999,
                        "minimum": 0,
                        "default": 0
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "bloco.registo",
                "x-anagen-clinico": false
            },
            "Recurso_checklist_modelos_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "fase": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fase",
                        "enum": [
                            "pre_operatorio",
                            "admissao",
                            "desenho",
                            "anestesia",
                            "extracao",
                            "implantacao",
                            "penso",
                            "alta"
                        ],
                        "x-enum-rotulos": {
                            "pre_operatorio": "Pré-operatório",
                            "admissao": "Admissão",
                            "desenho": "Desenho",
                            "anestesia": "Anestesia",
                            "extracao": "Extração",
                            "implantacao": "Implantação",
                            "penso": "Penso",
                            "alta": "Alta"
                        }
                    },
                    "chave": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Chave",
                        "maxLength": 40,
                        "pattern": "/^[a-z0-9_]{2,40}$/"
                    },
                    "itens_texto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Itens",
                        "description": "Um item por linha. Comece com «(opcional)» para itens não obrigatórios e termine com [enfermeiro], [cirurgiao], [tecnico]… para indicar o responsável.",
                        "maxLength": 12000
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 999,
                        "minimum": 0,
                        "default": 0
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    }
                },
                "required": [
                    "nome",
                    "fase",
                    "itens_texto"
                ]
            },
            "Recurso_cirurgias": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "numero": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Número",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes",
                        "readOnly": true
                    },
                    "inicio_previsto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Data prevista",
                        "readOnly": true
                    },
                    "sala_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Sala",
                        "x-anagen-recurso": "recursos_agenda",
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "pre_marcada",
                            "reservada",
                            "validada",
                            "confirmada",
                            "em_curso",
                            "concluida",
                            "cancelada"
                        ],
                        "x-enum-rotulos": {
                            "pre_marcada": "Pré-marcada",
                            "reservada": "Reservada",
                            "validada": "Validada",
                            "confirmada": "Confirmada",
                            "em_curso": "Em curso",
                            "concluida": "Concluída",
                            "cancelada": "Cancelada"
                        },
                        "readOnly": true
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Técnica",
                        "enum": [
                            "FUE",
                            "FUT",
                            "DHI",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "FUE": "FUE",
                            "FUT": "FUT",
                            "DHI": "DHI",
                            "outra": "Outra"
                        },
                        "readOnly": true
                    },
                    "aptidao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Aptidão",
                        "enum": [
                            "por_avaliar",
                            "apto",
                            "nao_apto"
                        ],
                        "x-enum-rotulos": {
                            "por_avaliar": "Por avaliar",
                            "apto": "Apto",
                            "nao_apto": "Não apto"
                        },
                        "readOnly": true
                    },
                    "enxertos_planeados": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Enxertos planeados",
                        "readOnly": true
                    },
                    "enxertos_extraidos": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Enxertos extraídos",
                        "readOnly": true
                    },
                    "enxertos_implantados": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Enxertos implantados",
                        "readOnly": true
                    },
                    "cabelos_total": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Total de cabelos",
                        "readOnly": true
                    },
                    "transeccao_pct": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Transecção",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "fechada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Fechada em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "bloco.mapa",
                "x-anagen-clinico": false
            },
            "Recurso_cirurgias_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_clinicas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "codigo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Código da clínica",
                        "description": "Código público que os pacientes usam na aplicação. Altera-se na licença da clínica.",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "nome_legal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Denominação legal",
                        "maxLength": 200
                    },
                    "nif": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{9}$",
                        "title": "NIF"
                    },
                    "ers_registo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "N.º de registo na ERS",
                        "maxLength": 40
                    },
                    "licenca_numero": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "N.º da licença",
                        "maxLength": 60
                    },
                    "morada": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Morada",
                        "maxLength": 255
                    },
                    "codigo_postal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{4}-\\d{3}$",
                        "title": "Código postal"
                    },
                    "localidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Localidade",
                        "maxLength": 100
                    },
                    "pais": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "País",
                        "enum": [
                            "PT",
                            "ES",
                            "FR",
                            "BR",
                            "GB",
                            "DE"
                        ],
                        "x-enum-rotulos": {
                            "PT": "Portugal",
                            "ES": "España",
                            "FR": "France",
                            "BR": "Brasil",
                            "GB": "United Kingdom",
                            "DE": "Deutschland"
                        },
                        "default": "PT"
                    },
                    "telefone": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Telefone"
                    },
                    "email": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "email",
                        "title": "Email",
                        "maxLength": 190
                    },
                    "website": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "uri",
                        "title": "Site",
                        "maxLength": 190
                    },
                    "logotipo_ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Logótipo"
                    },
                    "cor_marca": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9a-fA-F]{6}$",
                        "title": "Cor da marca"
                    },
                    "fuso": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fuso horário",
                        "enum": [
                            "Europe/Lisbon",
                            "Atlantic/Madeira",
                            "Atlantic/Azores",
                            "Europe/Madrid",
                            "Europe/Paris",
                            "Europe/London"
                        ],
                        "x-enum-rotulos": {
                            "Europe/Lisbon": "Lisboa",
                            "Atlantic/Madeira": "Madeira",
                            "Atlantic/Azores": "Açores",
                            "Europe/Madrid": "Madrid",
                            "Europe/Paris": "Paris",
                            "Europe/London": "Londres"
                        },
                        "default": "Europe/Lisbon"
                    },
                    "moeda": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Moeda",
                        "enum": [
                            "EUR",
                            "GBP",
                            "BRL"
                        ],
                        "x-enum-rotulos": {
                            "EUR": "Euro (EUR)",
                            "GBP": "Libra (GBP)",
                            "BRL": "Real (BRL)"
                        },
                        "default": "EUR"
                    },
                    "modulos_ativos": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "admin.utilizadores",
                                "admin.definicoes",
                                "admin.auditoria",
                                "clinico.parametros",
                                "ficha.identificacao",
                                "ficha.consentimentos",
                                "ficha.clinica",
                                "ficha.captura",
                                "ficha.fotografias",
                                "ficha.plano",
                                "crm.leads",
                                "crm.atendimento",
                                "crm.telefonia",
                                "crm.agente",
                                "marketing",
                                "agenda",
                                "teleconsulta",
                                "bloco.mapa",
                                "bloco.marcar",
                                "bloco.registo",
                                "acompanhamento",
                                "comercial.propostas",
                                "comercial.descontos",
                                "financeiro.pagamentos",
                                "financeiro.valores",
                                "stock",
                                "documentos",
                                "conformidade",
                                "equipa.tarefas",
                                "equipa.chat",
                                "indicadores.financeiros",
                                "indicadores.vendas",
                                "indicadores.operacionais",
                                "indicadores.atendimento",
                                "site.cms"
                            ]
                        },
                        "title": "Módulos ativos",
                        "description": "Os módulos essenciais (utilizadores, definições, auditoria e tarefas) estão sempre ativos.",
                        "x-enum-rotulos": {
                            "admin.utilizadores": "Utilizadores e acessos",
                            "admin.definicoes": "Definições",
                            "admin.auditoria": "Auditoria",
                            "clinico.parametros": "Parâmetros clínicos",
                            "ficha.identificacao": "Identificação do paciente",
                            "ficha.consentimentos": "Consentimentos",
                            "ficha.clinica": "Ficha clínica",
                            "ficha.captura": "Captura e tricoscopia",
                            "ficha.fotografias": "Fotografias clínicas",
                            "ficha.plano": "Plano cirúrgico",
                            "crm.leads": "Leads e funil",
                            "crm.atendimento": "Atendimento",
                            "crm.telefonia": "Telefonia",
                            "crm.agente": "Agente de conversação",
                            "marketing": "Marketing",
                            "agenda": "Agenda",
                            "teleconsulta": "Teleconsulta",
                            "bloco.mapa": "Mapa de cirurgias",
                            "bloco.marcar": "Marcação de cirurgias",
                            "bloco.registo": "Registo cirúrgico",
                            "acompanhamento": "Acompanhamento",
                            "comercial.propostas": "Propostas",
                            "comercial.descontos": "Descontos",
                            "financeiro.pagamentos": "Pagamentos",
                            "financeiro.valores": "Valores e comissões",
                            "stock": "Stock",
                            "documentos": "Documentos",
                            "conformidade": "Conformidade",
                            "equipa.tarefas": "Tarefas",
                            "equipa.chat": "Conversas da equipa",
                            "indicadores.financeiros": "Indicadores financeiros",
                            "indicadores.vendas": "Indicadores de vendas",
                            "indicadores.operacionais": "Indicadores operacionais",
                            "indicadores.atendimento": "Indicadores de atendimento",
                            "site.cms": "Site e conteúdos"
                        }
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-clinico": false
            },
            "Recurso_clinicas_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "nome_legal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Denominação legal",
                        "maxLength": 200
                    },
                    "nif": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{9}$",
                        "title": "NIF"
                    },
                    "ers_registo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "N.º de registo na ERS",
                        "maxLength": 40
                    },
                    "licenca_numero": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "N.º da licença",
                        "maxLength": 60
                    },
                    "morada": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Morada",
                        "maxLength": 255
                    },
                    "codigo_postal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{4}-\\d{3}$",
                        "title": "Código postal"
                    },
                    "localidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Localidade",
                        "maxLength": 100
                    },
                    "pais": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "País",
                        "enum": [
                            "PT",
                            "ES",
                            "FR",
                            "BR",
                            "GB",
                            "DE"
                        ],
                        "x-enum-rotulos": {
                            "PT": "Portugal",
                            "ES": "España",
                            "FR": "France",
                            "BR": "Brasil",
                            "GB": "United Kingdom",
                            "DE": "Deutschland"
                        },
                        "default": "PT"
                    },
                    "telefone": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Telefone"
                    },
                    "email": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "email",
                        "title": "Email",
                        "maxLength": 190
                    },
                    "website": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "uri",
                        "title": "Site",
                        "maxLength": 190
                    },
                    "logotipo_ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Logótipo"
                    },
                    "cor_marca": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9a-fA-F]{6}$",
                        "title": "Cor da marca"
                    },
                    "fuso": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fuso horário",
                        "enum": [
                            "Europe/Lisbon",
                            "Atlantic/Madeira",
                            "Atlantic/Azores",
                            "Europe/Madrid",
                            "Europe/Paris",
                            "Europe/London"
                        ],
                        "x-enum-rotulos": {
                            "Europe/Lisbon": "Lisboa",
                            "Atlantic/Madeira": "Madeira",
                            "Atlantic/Azores": "Açores",
                            "Europe/Madrid": "Madrid",
                            "Europe/Paris": "Paris",
                            "Europe/London": "Londres"
                        },
                        "default": "Europe/Lisbon"
                    },
                    "moeda": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Moeda",
                        "enum": [
                            "EUR",
                            "GBP",
                            "BRL"
                        ],
                        "x-enum-rotulos": {
                            "EUR": "Euro (EUR)",
                            "GBP": "Libra (GBP)",
                            "BRL": "Real (BRL)"
                        },
                        "default": "EUR"
                    },
                    "modulos_ativos": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "admin.utilizadores",
                                "admin.definicoes",
                                "admin.auditoria",
                                "clinico.parametros",
                                "ficha.identificacao",
                                "ficha.consentimentos",
                                "ficha.clinica",
                                "ficha.captura",
                                "ficha.fotografias",
                                "ficha.plano",
                                "crm.leads",
                                "crm.atendimento",
                                "crm.telefonia",
                                "crm.agente",
                                "marketing",
                                "agenda",
                                "teleconsulta",
                                "bloco.mapa",
                                "bloco.marcar",
                                "bloco.registo",
                                "acompanhamento",
                                "comercial.propostas",
                                "comercial.descontos",
                                "financeiro.pagamentos",
                                "financeiro.valores",
                                "stock",
                                "documentos",
                                "conformidade",
                                "equipa.tarefas",
                                "equipa.chat",
                                "indicadores.financeiros",
                                "indicadores.vendas",
                                "indicadores.operacionais",
                                "indicadores.atendimento",
                                "site.cms"
                            ]
                        },
                        "title": "Módulos ativos",
                        "description": "Os módulos essenciais (utilizadores, definições, auditoria e tarefas) estão sempre ativos.",
                        "x-enum-rotulos": {
                            "admin.utilizadores": "Utilizadores e acessos",
                            "admin.definicoes": "Definições",
                            "admin.auditoria": "Auditoria",
                            "clinico.parametros": "Parâmetros clínicos",
                            "ficha.identificacao": "Identificação do paciente",
                            "ficha.consentimentos": "Consentimentos",
                            "ficha.clinica": "Ficha clínica",
                            "ficha.captura": "Captura e tricoscopia",
                            "ficha.fotografias": "Fotografias clínicas",
                            "ficha.plano": "Plano cirúrgico",
                            "crm.leads": "Leads e funil",
                            "crm.atendimento": "Atendimento",
                            "crm.telefonia": "Telefonia",
                            "crm.agente": "Agente de conversação",
                            "marketing": "Marketing",
                            "agenda": "Agenda",
                            "teleconsulta": "Teleconsulta",
                            "bloco.mapa": "Mapa de cirurgias",
                            "bloco.marcar": "Marcação de cirurgias",
                            "bloco.registo": "Registo cirúrgico",
                            "acompanhamento": "Acompanhamento",
                            "comercial.propostas": "Propostas",
                            "comercial.descontos": "Descontos",
                            "financeiro.pagamentos": "Pagamentos",
                            "financeiro.valores": "Valores e comissões",
                            "stock": "Stock",
                            "documentos": "Documentos",
                            "conformidade": "Conformidade",
                            "equipa.tarefas": "Tarefas",
                            "equipa.chat": "Conversas da equipa",
                            "indicadores.financeiros": "Indicadores financeiros",
                            "indicadores.vendas": "Indicadores de vendas",
                            "indicadores.operacionais": "Indicadores operacionais",
                            "indicadores.atendimento": "Indicadores de atendimento",
                            "site.cms": "Site e conteúdos"
                        }
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    }
                },
                "required": [
                    "nome"
                ]
            },
            "Recurso_cms_blocos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "pagina": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Página",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "seccao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Secção",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "rotulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Bloco",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "chave": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Chave",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt",
                            "en"
                        ],
                        "x-enum-rotulos": "Português",
                        "readOnly": true
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "texto",
                            "textoLongo",
                            "html",
                            "imagem",
                            "lista",
                            "ligacao"
                        ],
                        "x-enum-rotulos": {
                            "texto": "Texto",
                            "textoLongo": "Texto longo",
                            "html": "Texto formatado",
                            "imagem": "Imagem",
                            "lista": "Lista",
                            "ligacao": "Ligação"
                        },
                        "readOnly": true
                    },
                    "valor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Valor",
                        "description": "Nas listas e ligações o valor é estruturado; no editor do CMS edita-se campo a campo.",
                        "maxLength": 300000
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Imagem (n.º na biblioteca)",
                        "description": "Número da imagem na biblioteca.",
                        "minimum": 1
                    },
                    "ajuda": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Ajuda",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-clinico": false
            },
            "Recurso_cms_blocos_Entrada": {
                "type": "object",
                "properties": {
                    "valor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Valor",
                        "description": "Nas listas e ligações o valor é estruturado; no editor do CMS edita-se campo a campo.",
                        "maxLength": 300000
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Imagem (n.º na biblioteca)",
                        "description": "Número da imagem na biblioteca.",
                        "minimum": 1
                    }
                }
            },
            "Recurso_cms_paginas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 200
                    },
                    "chave": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Chave",
                        "description": "Identificador interno (igual nas duas línguas).",
                        "maxLength": 80,
                        "pattern": "/^[a-z][a-z0-9_]{1,79}$/"
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt",
                            "en"
                        ],
                        "x-enum-rotulos": "Português",
                        "default": "pt"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "institucional",
                            "procedimento",
                            "legal",
                            "caso"
                        ],
                        "x-enum-rotulos": {
                            "institucional": "Institucional",
                            "procedimento": "Procedimento",
                            "legal": "Legal",
                            "caso": "Caso"
                        },
                        "default": "institucional"
                    },
                    "slug": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Endereço",
                        "description": "Parte final do endereço, ex.: fue.",
                        "maxLength": 160,
                        "pattern": "/^[a-z0-9]+(?:-[a-z0-9]+)*$/"
                    },
                    "resumo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resumo",
                        "maxLength": 500
                    },
                    "conteudo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Conteúdo",
                        "description": "Use os marcadores {clinica.nome_legal}, {clinica.nif}, {clinica.morada}… para os dados legais da clínica."
                    },
                    "meta_titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título para pesquisa",
                        "description": "Até 60 caracteres.",
                        "maxLength": 200
                    },
                    "meta_descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição para pesquisa",
                        "description": "Até 160 caracteres.",
                        "maxLength": 320
                    },
                    "imagem_ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Imagem (n.º na biblioteca)",
                        "description": "Número da imagem na biblioteca de imagens do site.",
                        "minimum": 1
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 9999,
                        "minimum": 0,
                        "default": 0
                    },
                    "publicada": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Publicada",
                        "readOnly": true
                    },
                    "versao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Versão",
                        "readOnly": true
                    },
                    "publicada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Publicada em",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "site.cms",
                "x-anagen-clinico": false
            },
            "Recurso_cms_paginas_Entrada": {
                "type": "object",
                "properties": {
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 200
                    },
                    "chave": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Chave",
                        "description": "Identificador interno (igual nas duas línguas).",
                        "maxLength": 80,
                        "pattern": "/^[a-z][a-z0-9_]{1,79}$/"
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt",
                            "en"
                        ],
                        "x-enum-rotulos": "Português",
                        "default": "pt"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "institucional",
                            "procedimento",
                            "legal",
                            "caso"
                        ],
                        "x-enum-rotulos": {
                            "institucional": "Institucional",
                            "procedimento": "Procedimento",
                            "legal": "Legal",
                            "caso": "Caso"
                        },
                        "default": "institucional"
                    },
                    "slug": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Endereço",
                        "description": "Parte final do endereço, ex.: fue.",
                        "maxLength": 160,
                        "pattern": "/^[a-z0-9]+(?:-[a-z0-9]+)*$/"
                    },
                    "resumo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resumo",
                        "maxLength": 500
                    },
                    "conteudo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Conteúdo",
                        "description": "Use os marcadores {clinica.nome_legal}, {clinica.nif}, {clinica.morada}… para os dados legais da clínica."
                    },
                    "meta_titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título para pesquisa",
                        "description": "Até 60 caracteres.",
                        "maxLength": 200
                    },
                    "meta_descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição para pesquisa",
                        "description": "Até 160 caracteres.",
                        "maxLength": 320
                    },
                    "imagem_ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Imagem (n.º na biblioteca)",
                        "description": "Número da imagem na biblioteca de imagens do site.",
                        "minimum": 1
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 9999,
                        "minimum": 0,
                        "default": 0
                    }
                },
                "required": [
                    "titulo",
                    "chave",
                    "idioma",
                    "tipo",
                    "slug"
                ]
            },
            "Recurso_codigos_desconto": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "codigo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Código",
                        "description": "Letras, algarismos, «-» e «_». Guardado em maiúsculas.",
                        "maxLength": 40
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 190
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "percentagem",
                            "fixo"
                        ],
                        "x-enum-rotulos": {
                            "percentagem": "Percentagem",
                            "fixo": "Valor fixo"
                        },
                        "default": "percentagem"
                    },
                    "percentagem": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Percentagem",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2
                    },
                    "valor": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Valor fixo",
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "minimo": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Valor mínimo da proposta",
                        "description": "Subtotal antes do desconto.",
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "procedimentos": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "title": "Procedimentos abrangidos",
                        "description": "Vazio = todos.",
                        "x-anagen-recurso": "procedimentos"
                    },
                    "valido_desde": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válido desde"
                    },
                    "valido_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válido até"
                    },
                    "limite_usos": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Limite de usos",
                        "description": "Conta as propostas com o código que não foram recusadas nem expiraram.",
                        "maximum": 1000000,
                        "minimum": 1
                    },
                    "limite_por_paciente": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Limite por paciente",
                        "maximum": 100,
                        "minimum": 1
                    },
                    "aprovacao_acima_pct": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Aprovação acima de (%)",
                        "description": "Acima desta percentagem efetiva, o desconto fica à espera de quem aprova descontos. Vazio = aprovado pelo código.",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 2000
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "comercial.descontos",
                "x-anagen-clinico": false
            },
            "Recurso_codigos_desconto_Entrada": {
                "type": "object",
                "properties": {
                    "codigo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Código",
                        "description": "Letras, algarismos, «-» e «_». Guardado em maiúsculas.",
                        "maxLength": 40
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 190
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "percentagem",
                            "fixo"
                        ],
                        "x-enum-rotulos": {
                            "percentagem": "Percentagem",
                            "fixo": "Valor fixo"
                        },
                        "default": "percentagem"
                    },
                    "percentagem": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Percentagem",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2
                    },
                    "valor": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Valor fixo",
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "minimo": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Valor mínimo da proposta",
                        "description": "Subtotal antes do desconto.",
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "procedimentos": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "title": "Procedimentos abrangidos",
                        "description": "Vazio = todos.",
                        "x-anagen-recurso": "procedimentos"
                    },
                    "valido_desde": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válido desde"
                    },
                    "valido_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válido até"
                    },
                    "limite_usos": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Limite de usos",
                        "description": "Conta as propostas com o código que não foram recusadas nem expiraram.",
                        "maximum": 1000000,
                        "minimum": 1
                    },
                    "limite_por_paciente": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Limite por paciente",
                        "maximum": 100,
                        "minimum": 1
                    },
                    "aprovacao_acima_pct": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Aprovação acima de (%)",
                        "description": "Acima desta percentagem efetiva, o desconto fica à espera de quem aprova descontos. Vazio = aprovado pelo código.",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 2000
                    }
                },
                "required": [
                    "codigo",
                    "tipo"
                ]
            },
            "Recurso_comissoes": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Pessoa",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "proposta_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Proposta",
                        "x-anagen-recurso": "propostas"
                    },
                    "regra_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Regra",
                        "x-anagen-recurso": "comissoes_regras",
                        "readOnly": true
                    },
                    "cirurgia_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Cirurgia",
                        "readOnly": true
                    },
                    "base_valor": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Base",
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "taxa": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Taxa",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "valor": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Valor",
                        "maximum": 100000,
                        "minimum": -100000,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "prevista",
                            "devida",
                            "paga",
                            "estornada"
                        ],
                        "x-enum-rotulos": {
                            "prevista": "Prevista",
                            "devida": "Devida",
                            "paga": "Paga",
                            "estornada": "Estornada"
                        },
                        "default": "devida"
                    },
                    "vence_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Vence em"
                    },
                    "paga_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Paga em",
                        "readOnly": true
                    },
                    "referencia_pagamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Referência do pagamento",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "motivo_estorno": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo do estorno",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 500
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-clinico": false
            },
            "Recurso_comissoes_Entrada": {
                "type": "object",
                "properties": {
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Pessoa",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "proposta_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Proposta",
                        "x-anagen-recurso": "propostas"
                    },
                    "base_valor": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Base",
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "valor": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Valor",
                        "maximum": 100000,
                        "minimum": -100000,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "prevista",
                            "devida",
                            "paga",
                            "estornada"
                        ],
                        "x-enum-rotulos": {
                            "prevista": "Prevista",
                            "devida": "Devida",
                            "paga": "Paga",
                            "estornada": "Estornada"
                        },
                        "default": "devida"
                    },
                    "vence_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Vence em"
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 500
                    }
                },
                "required": [
                    "utilizador_id",
                    "valor"
                ]
            },
            "Recurso_comissoes_regras": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Pessoa",
                        "description": "Deixe vazio para aplicar ao perfil.",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "perfil_chave": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Perfil",
                        "description": "Aplica-se a todas as pessoas deste perfil sem regra própria.",
                        "maxLength": 40,
                        "pattern": "^[a-z0-9_]{2,40}$",
                        "default": "comercial"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "percentagem",
                            "fixo"
                        ],
                        "x-enum-rotulos": {
                            "percentagem": "Percentagem",
                            "fixo": "Valor fixo"
                        },
                        "default": "percentagem"
                    },
                    "valor": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Valor",
                        "description": "Percentagem ou valor fixo por proposta.",
                        "maximum": 100000,
                        "minimum": 0,
                        "x-casas": 2
                    },
                    "escaloes": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Escalões",
                        "description": "Percentagens por intervalos de valor (opcional)."
                    },
                    "base": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Base de cálculo",
                        "enum": [
                            "bruto",
                            "sem_iva",
                            "liquido_descontos",
                            "liquido_consumiveis"
                        ],
                        "x-enum-rotulos": {
                            "bruto": "Valor total",
                            "sem_iva": "Valor sem IVA",
                            "liquido_descontos": "Valor após descontos",
                            "liquido_consumiveis": "Valor após descontos e consumíveis"
                        },
                        "default": "liquido_descontos"
                    },
                    "vencimento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Vencimento",
                        "enum": [
                            "aceite",
                            "recebido",
                            "cirurgia"
                        ],
                        "x-enum-rotulos": {
                            "aceite": "Na aceitação",
                            "recebido": "No recebimento total",
                            "cirurgia": "Na cirurgia"
                        },
                        "default": "recebido"
                    },
                    "procedimentos": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "title": "Procedimentos",
                        "description": "Deixe vazio para todos.",
                        "x-anagen-recurso": "procedimentos"
                    },
                    "estorno_cancelamento": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Estornar se a proposta for cancelada ou reembolsada",
                        "default": 1
                    },
                    "valida_desde": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válida desde"
                    },
                    "valida_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válida até"
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-clinico": false
            },
            "Recurso_comissoes_regras_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Pessoa",
                        "description": "Deixe vazio para aplicar ao perfil.",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "perfil_chave": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Perfil",
                        "description": "Aplica-se a todas as pessoas deste perfil sem regra própria.",
                        "maxLength": 40,
                        "pattern": "^[a-z0-9_]{2,40}$",
                        "default": "comercial"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "percentagem",
                            "fixo"
                        ],
                        "x-enum-rotulos": {
                            "percentagem": "Percentagem",
                            "fixo": "Valor fixo"
                        },
                        "default": "percentagem"
                    },
                    "valor": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Valor",
                        "description": "Percentagem ou valor fixo por proposta.",
                        "maximum": 100000,
                        "minimum": 0,
                        "x-casas": 2
                    },
                    "escaloes": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Escalões",
                        "description": "Percentagens por intervalos de valor (opcional)."
                    },
                    "base": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Base de cálculo",
                        "enum": [
                            "bruto",
                            "sem_iva",
                            "liquido_descontos",
                            "liquido_consumiveis"
                        ],
                        "x-enum-rotulos": {
                            "bruto": "Valor total",
                            "sem_iva": "Valor sem IVA",
                            "liquido_descontos": "Valor após descontos",
                            "liquido_consumiveis": "Valor após descontos e consumíveis"
                        },
                        "default": "liquido_descontos"
                    },
                    "vencimento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Vencimento",
                        "enum": [
                            "aceite",
                            "recebido",
                            "cirurgia"
                        ],
                        "x-enum-rotulos": {
                            "aceite": "Na aceitação",
                            "recebido": "No recebimento total",
                            "cirurgia": "Na cirurgia"
                        },
                        "default": "recebido"
                    },
                    "procedimentos": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "title": "Procedimentos",
                        "description": "Deixe vazio para todos.",
                        "x-anagen-recurso": "procedimentos"
                    },
                    "estorno_cancelamento": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Estornar se a proposta for cancelada ou reembolsada",
                        "default": 1
                    },
                    "valida_desde": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válida desde"
                    },
                    "valida_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válida até"
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    }
                },
                "required": [
                    "nome",
                    "tipo",
                    "valor",
                    "base",
                    "vencimento"
                ]
            },
            "Recurso_complicacoes": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Episódio",
                        "x-anagen-recurso": "episodios"
                    },
                    "cirurgia_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Cirurgia",
                        "x-anagen-recurso": "cirurgias"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "foliculite",
                            "infecao",
                            "edema",
                            "hemorragia",
                            "dor_persistente",
                            "parestesia",
                            "efluvio",
                            "quisto",
                            "necrose",
                            "cicatriz",
                            "crescimento_insuficiente",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "foliculite": "Foliculite",
                            "infecao": "Infeção",
                            "edema": "Edema",
                            "hemorragia": "Hemorragia",
                            "dor_persistente": "Dor persistente",
                            "parestesia": "Parestesia / dormência",
                            "efluvio": "Eflúvio de choque",
                            "quisto": "Quisto de inclusão",
                            "necrose": "Necrose",
                            "cicatriz": "Cicatriz alterada",
                            "crescimento_insuficiente": "Crescimento insuficiente",
                            "outra": "Outra"
                        }
                    },
                    "gravidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Gravidade",
                        "enum": [
                            "ligeira",
                            "moderada",
                            "grave"
                        ],
                        "x-enum-rotulos": {
                            "ligeira": "Ligeira",
                            "moderada": "Moderada",
                            "grave": "Grave"
                        },
                        "default": "ligeira"
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 8000,
                        "x-anagen-cifrado": "clinico"
                    },
                    "tratamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tratamento",
                        "maxLength": 8000,
                        "x-anagen-cifrado": "clinico"
                    },
                    "recall": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Chamar o paciente",
                        "description": "Na data indicada é aberta uma tarefa de chamada para a enfermagem."
                    },
                    "recall_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data da chamada"
                    },
                    "resolvida_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Resolvida em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-clinico": true
            },
            "Recurso_complicacoes_Entrada": {
                "type": "object",
                "properties": {
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Episódio",
                        "x-anagen-recurso": "episodios"
                    },
                    "cirurgia_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Cirurgia",
                        "x-anagen-recurso": "cirurgias"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "foliculite",
                            "infecao",
                            "edema",
                            "hemorragia",
                            "dor_persistente",
                            "parestesia",
                            "efluvio",
                            "quisto",
                            "necrose",
                            "cicatriz",
                            "crescimento_insuficiente",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "foliculite": "Foliculite",
                            "infecao": "Infeção",
                            "edema": "Edema",
                            "hemorragia": "Hemorragia",
                            "dor_persistente": "Dor persistente",
                            "parestesia": "Parestesia / dormência",
                            "efluvio": "Eflúvio de choque",
                            "quisto": "Quisto de inclusão",
                            "necrose": "Necrose",
                            "cicatriz": "Cicatriz alterada",
                            "crescimento_insuficiente": "Crescimento insuficiente",
                            "outra": "Outra"
                        }
                    },
                    "gravidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Gravidade",
                        "enum": [
                            "ligeira",
                            "moderada",
                            "grave"
                        ],
                        "x-enum-rotulos": {
                            "ligeira": "Ligeira",
                            "moderada": "Moderada",
                            "grave": "Grave"
                        },
                        "default": "ligeira"
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 8000,
                        "x-anagen-cifrado": "clinico"
                    },
                    "tratamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tratamento",
                        "maxLength": 8000,
                        "x-anagen-cifrado": "clinico"
                    },
                    "recall": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Chamar o paciente",
                        "description": "Na data indicada é aberta uma tarefa de chamada para a enfermagem."
                    },
                    "recall_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data da chamada"
                    }
                },
                "required": [
                    "paciente_id",
                    "tipo",
                    "gravidade",
                    "data",
                    "descricao"
                ]
            },
            "Recurso_comunicados": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 200
                    },
                    "corpo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Texto"
                    },
                    "publico": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Para quem",
                        "enum": [
                            "todos",
                            "departamento",
                            "perfil"
                        ],
                        "x-enum-rotulos": {
                            "todos": "Toda a equipa",
                            "departamento": "Departamento",
                            "perfil": "Perfil"
                        },
                        "default": "todos"
                    },
                    "destino": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Departamento ou perfil",
                        "description": "Família de perfil (departamento) ou perfil a quem se dirige.",
                        "enum": [
                            "administracao",
                            "medico",
                            "enfermagem",
                            "tecnico",
                            "comercial",
                            "rececao"
                        ],
                        "x-enum-rotulos": {
                            "administracao": "Administração",
                            "medico": "Médico",
                            "enfermagem": "Enfermagem",
                            "tecnico": "Técnico",
                            "comercial": "Comercial",
                            "rececao": "Receção"
                        }
                    },
                    "importancia": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Importância",
                        "enum": [
                            "normal",
                            "alta"
                        ],
                        "x-enum-rotulos": {
                            "normal": "Normal",
                            "alta": "Importante"
                        },
                        "default": "normal"
                    },
                    "exige_leitura": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Pedir confirmação de leitura",
                        "description": "Cada pessoa confirma «Li e tomei conhecimento»; vê quem falta ler.",
                        "default": 1
                    },
                    "fixado": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Fixar no topo",
                        "default": 0
                    },
                    "publicado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Publicar em",
                        "description": "Vazio = publicar já. Uma data futura agenda a publicação."
                    },
                    "expira_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Deixa de aparecer em"
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-clinico": false
            },
            "Recurso_comunicados_Entrada": {
                "type": "object",
                "properties": {
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 200
                    },
                    "corpo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Texto"
                    },
                    "publico": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Para quem",
                        "enum": [
                            "todos",
                            "departamento",
                            "perfil"
                        ],
                        "x-enum-rotulos": {
                            "todos": "Toda a equipa",
                            "departamento": "Departamento",
                            "perfil": "Perfil"
                        },
                        "default": "todos"
                    },
                    "destino": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Departamento ou perfil",
                        "description": "Família de perfil (departamento) ou perfil a quem se dirige.",
                        "enum": [
                            "administracao",
                            "medico",
                            "enfermagem",
                            "tecnico",
                            "comercial",
                            "rececao"
                        ],
                        "x-enum-rotulos": {
                            "administracao": "Administração",
                            "medico": "Médico",
                            "enfermagem": "Enfermagem",
                            "tecnico": "Técnico",
                            "comercial": "Comercial",
                            "rececao": "Receção"
                        }
                    },
                    "importancia": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Importância",
                        "enum": [
                            "normal",
                            "alta"
                        ],
                        "x-enum-rotulos": {
                            "normal": "Normal",
                            "alta": "Importante"
                        },
                        "default": "normal"
                    },
                    "exige_leitura": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Pedir confirmação de leitura",
                        "description": "Cada pessoa confirma «Li e tomei conhecimento»; vê quem falta ler.",
                        "default": 1
                    },
                    "fixado": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Fixar no topo",
                        "default": 0
                    },
                    "publicado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Publicar em",
                        "description": "Vazio = publicar já. Uma data futura agenda a publicação."
                    },
                    "expira_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Deixa de aparecer em"
                    }
                },
                "required": [
                    "titulo",
                    "corpo"
                ]
            },
            "Recurso_consentimento_modelos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 200
                    },
                    "chave": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Chave",
                        "description": "Identificador estável do modelo (letras minúsculas, algarismos e «_»). As novas versões mantêm a mesma chave.",
                        "maxLength": 60,
                        "pattern": "^[a-z][a-z0-9_]{2,59}$"
                    },
                    "finalidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Finalidade",
                        "enum": [
                            "tratamento_clinico",
                            "fotografias_clinicas",
                            "imagens_comunicacao",
                            "captura_3d",
                            "gravacao_chamadas",
                            "gravacao_video",
                            "ia",
                            "agente_voz",
                            "marketing",
                            "partilha_terceiros",
                            "teleconsulta",
                            "cirurgico",
                            "contacto"
                        ],
                        "x-enum-rotulos": {
                            "tratamento_clinico": "Tratamento de dados para cuidados de saúde",
                            "fotografias_clinicas": "Fotografias clínicas",
                            "imagens_comunicacao": "Imagens em comunicação e redes sociais",
                            "captura_3d": "Captura e modelos 3D",
                            "gravacao_chamadas": "Gravação de chamadas",
                            "gravacao_video": "Gravação de vídeo",
                            "ia": "Assistente de inteligência artificial",
                            "agente_voz": "Agente de voz",
                            "marketing": "Comunicações de marketing",
                            "partilha_terceiros": "Partilha com terceiros",
                            "teleconsulta": "Teleconsulta",
                            "cirurgico": "Consentimento cirúrgico",
                            "contacto": "Contacto comercial"
                        }
                    },
                    "base_legal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fundamento jurídico",
                        "description": "Fundamento do tratamento (RGPD, art. 6.º e 9.º). Para dados de saúde em cuidados, «Prestação de cuidados de saúde»; para imagens em comunicação ou marketing, «Consentimento».",
                        "enum": [
                            "consentimento",
                            "prestacao_cuidados",
                            "contrato",
                            "interesse_legitimo",
                            "obrigacao_legal"
                        ],
                        "x-enum-rotulos": {
                            "consentimento": "Consentimento",
                            "prestacao_cuidados": "Prestação de cuidados de saúde",
                            "contrato": "Execução de contrato",
                            "interesse_legitimo": "Interesse legítimo",
                            "obrigacao_legal": "Obrigação legal"
                        },
                        "default": "consentimento"
                    },
                    "obrigatorio": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Obrigatório",
                        "description": "Assinalado como em falta na ficha e no painel enquanto o paciente não decidir."
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português (Portugal)",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        },
                        "default": "pt-PT"
                    },
                    "procedimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Procedimento",
                        "x-anagen-recurso": "procedimentos"
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Técnica",
                        "enum": [
                            "FUE",
                            "FUT",
                            "DHI",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "FUE": "FUE",
                            "FUT": "FUT",
                            "DHI": "DHI",
                            "outra": "Outra técnica"
                        }
                    },
                    "reflexao_horas": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Período de reflexão (horas)",
                        "description": "Tempo mínimo entre a entrega da informação e a assinatura. Nos consentimentos cirúrgicos aplica-se pelo menos o valor das Definições.",
                        "maximum": 720,
                        "minimum": 0
                    },
                    "versao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Versão",
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "rascunho",
                            "aprovado",
                            "arquivado"
                        ],
                        "x-enum-rotulos": {
                            "rascunho": "Rascunho",
                            "aprovado": "Aprovado",
                            "arquivado": "Arquivado"
                        },
                        "readOnly": true
                    },
                    "introducao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Introdução",
                        "description": "Texto curto mostrado antes das secções (pode usar campos como {{paciente.nome}})."
                    },
                    "dgs_ato": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição do ato",
                        "maxLength": 20000
                    },
                    "dgs_objetivos": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Objetivos",
                        "maxLength": 20000
                    },
                    "dgs_beneficios": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Benefícios esperados",
                        "maxLength": 20000
                    },
                    "dgs_riscos": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Riscos frequentes e graves",
                        "maxLength": 30000
                    },
                    "dgs_alternativas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Alternativas",
                        "maxLength": 20000
                    },
                    "dgs_cuidados": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Cuidados antes e depois",
                        "maxLength": 20000
                    },
                    "dgs_declaracao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Declaração do paciente",
                        "maxLength": 20000
                    },
                    "texto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Texto completo",
                        "description": "Texto que o paciente lê e aceita. Nos modelos cirúrgicos é composto a partir das secções da Norma 015/2013 da DGS.",
                        "readOnly": true
                    },
                    "revisao_juridica": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Revisto pelo encarregado/jurídico",
                        "readOnly": true
                    },
                    "aprovado_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Aprovado por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "aprovado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Aprovado em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-clinico": false
            },
            "Recurso_consentimento_modelos_Entrada": {
                "type": "object",
                "properties": {
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 200
                    },
                    "chave": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Chave",
                        "description": "Identificador estável do modelo (letras minúsculas, algarismos e «_»). As novas versões mantêm a mesma chave.",
                        "maxLength": 60,
                        "pattern": "^[a-z][a-z0-9_]{2,59}$"
                    },
                    "finalidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Finalidade",
                        "enum": [
                            "tratamento_clinico",
                            "fotografias_clinicas",
                            "imagens_comunicacao",
                            "captura_3d",
                            "gravacao_chamadas",
                            "gravacao_video",
                            "ia",
                            "agente_voz",
                            "marketing",
                            "partilha_terceiros",
                            "teleconsulta",
                            "cirurgico",
                            "contacto"
                        ],
                        "x-enum-rotulos": {
                            "tratamento_clinico": "Tratamento de dados para cuidados de saúde",
                            "fotografias_clinicas": "Fotografias clínicas",
                            "imagens_comunicacao": "Imagens em comunicação e redes sociais",
                            "captura_3d": "Captura e modelos 3D",
                            "gravacao_chamadas": "Gravação de chamadas",
                            "gravacao_video": "Gravação de vídeo",
                            "ia": "Assistente de inteligência artificial",
                            "agente_voz": "Agente de voz",
                            "marketing": "Comunicações de marketing",
                            "partilha_terceiros": "Partilha com terceiros",
                            "teleconsulta": "Teleconsulta",
                            "cirurgico": "Consentimento cirúrgico",
                            "contacto": "Contacto comercial"
                        }
                    },
                    "base_legal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fundamento jurídico",
                        "description": "Fundamento do tratamento (RGPD, art. 6.º e 9.º). Para dados de saúde em cuidados, «Prestação de cuidados de saúde»; para imagens em comunicação ou marketing, «Consentimento».",
                        "enum": [
                            "consentimento",
                            "prestacao_cuidados",
                            "contrato",
                            "interesse_legitimo",
                            "obrigacao_legal"
                        ],
                        "x-enum-rotulos": {
                            "consentimento": "Consentimento",
                            "prestacao_cuidados": "Prestação de cuidados de saúde",
                            "contrato": "Execução de contrato",
                            "interesse_legitimo": "Interesse legítimo",
                            "obrigacao_legal": "Obrigação legal"
                        },
                        "default": "consentimento"
                    },
                    "obrigatorio": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Obrigatório",
                        "description": "Assinalado como em falta na ficha e no painel enquanto o paciente não decidir."
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português (Portugal)",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        },
                        "default": "pt-PT"
                    },
                    "procedimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Procedimento",
                        "x-anagen-recurso": "procedimentos"
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Técnica",
                        "enum": [
                            "FUE",
                            "FUT",
                            "DHI",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "FUE": "FUE",
                            "FUT": "FUT",
                            "DHI": "DHI",
                            "outra": "Outra técnica"
                        }
                    },
                    "reflexao_horas": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Período de reflexão (horas)",
                        "description": "Tempo mínimo entre a entrega da informação e a assinatura. Nos consentimentos cirúrgicos aplica-se pelo menos o valor das Definições.",
                        "maximum": 720,
                        "minimum": 0
                    },
                    "introducao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Introdução",
                        "description": "Texto curto mostrado antes das secções (pode usar campos como {{paciente.nome}})."
                    },
                    "dgs_ato": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição do ato",
                        "maxLength": 20000
                    },
                    "dgs_objetivos": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Objetivos",
                        "maxLength": 20000
                    },
                    "dgs_beneficios": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Benefícios esperados",
                        "maxLength": 20000
                    },
                    "dgs_riscos": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Riscos frequentes e graves",
                        "maxLength": 30000
                    },
                    "dgs_alternativas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Alternativas",
                        "maxLength": 20000
                    },
                    "dgs_cuidados": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Cuidados antes e depois",
                        "maxLength": 20000
                    },
                    "dgs_declaracao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Declaração do paciente",
                        "maxLength": 20000
                    }
                },
                "required": [
                    "titulo",
                    "chave",
                    "finalidade",
                    "base_legal",
                    "idioma"
                ]
            },
            "Recurso_consentimentos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes",
                        "readOnly": true
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Contacto",
                        "x-anagen-recurso": "leads",
                        "readOnly": true
                    },
                    "finalidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Finalidade",
                        "enum": [
                            "tratamento_clinico",
                            "fotografias_clinicas",
                            "imagens_comunicacao",
                            "captura_3d",
                            "gravacao_chamadas",
                            "gravacao_video",
                            "ia",
                            "agente_voz",
                            "marketing",
                            "partilha_terceiros",
                            "teleconsulta",
                            "cirurgico",
                            "contacto"
                        ],
                        "x-enum-rotulos": {
                            "tratamento_clinico": "Tratamento de dados para cuidados de saúde",
                            "fotografias_clinicas": "Fotografias clínicas",
                            "imagens_comunicacao": "Imagens em comunicação e redes sociais",
                            "captura_3d": "Captura e modelos 3D",
                            "gravacao_chamadas": "Gravação de chamadas",
                            "gravacao_video": "Gravação de vídeo",
                            "ia": "Assistente de inteligência artificial",
                            "agente_voz": "Agente de voz",
                            "marketing": "Comunicações de marketing",
                            "partilha_terceiros": "Partilha com terceiros",
                            "teleconsulta": "Teleconsulta",
                            "cirurgico": "Consentimento cirúrgico",
                            "contacto": "Contacto comercial"
                        },
                        "readOnly": true
                    },
                    "decisao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Decisão",
                        "enum": [
                            "dado",
                            "recusado",
                            "revogado"
                        ],
                        "x-enum-rotulos": {
                            "dado": "Dado",
                            "recusado": "Recusado",
                            "revogado": "Retirado"
                        },
                        "readOnly": true
                    },
                    "modelo_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Modelo",
                        "x-anagen-recurso": "consentimento_modelos",
                        "readOnly": true
                    },
                    "modelo_versao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Versão",
                        "readOnly": true
                    },
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal",
                        "enum": [
                            "portal",
                            "presencial",
                            "formulario_site",
                            "telefone",
                            "email",
                            "whatsapp",
                            "agente_voz",
                            "app"
                        ],
                        "x-enum-rotulos": {
                            "portal": "Portal do paciente",
                            "presencial": "Presencial",
                            "formulario_site": "Formulário do site",
                            "telefone": "Telefone",
                            "email": "Email",
                            "whatsapp": "WhatsApp",
                            "agente_voz": "Agente de voz",
                            "app": "Aplicação móvel"
                        },
                        "readOnly": true
                    },
                    "informacao_entregue_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Informação entregue em",
                        "readOnly": true
                    },
                    "assinado_paciente_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Assinado pelo paciente em",
                        "readOnly": true
                    },
                    "medico_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Médico(a)",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "assinado_medico_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Assinado pelo médico em",
                        "readOnly": true
                    },
                    "assinatura_ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Assinatura",
                        "readOnly": true
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Episódio",
                        "readOnly": true
                    },
                    "plano_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Plano",
                        "readOnly": true
                    },
                    "recolhido_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Recolhido por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "dispositivo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Dispositivo",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "ip": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Endereço IP",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "texto_hash": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Impressão digital do texto",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "impressao_digital": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Impressão digital do registo",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "ficha.consentimentos",
                "x-anagen-clinico": false
            },
            "Recurso_consentimentos_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_conservacao_regras": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "categoria": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Categoria",
                        "enum": [
                            "processo_clinico",
                            "leads_nao_convertidos",
                            "gravacoes_chamadas",
                            "imagens_bruto",
                            "auditoria",
                            "pedidos_titulares",
                            "alertas_acesso",
                            "documentos_anulados",
                            "reclamacoes",
                            "faturacao"
                        ],
                        "x-enum-rotulos": {
                            "processo_clinico": "Processo clínico",
                            "leads_nao_convertidos": "Contactos não convertidos",
                            "gravacoes_chamadas": "Gravações de chamadas",
                            "imagens_bruto": "Imagens em bruto",
                            "auditoria": "Registo de auditoria",
                            "pedidos_titulares": "Pedidos dos titulares",
                            "alertas_acesso": "Alertas de acesso",
                            "documentos_anulados": "Documentos anulados",
                            "reclamacoes": "Reclamações",
                            "faturacao": "Faturação"
                        }
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 500
                    },
                    "prazo": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Prazo",
                        "maximum": 1200,
                        "minimum": 1
                    },
                    "unidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Unidade",
                        "enum": [
                            "dias",
                            "meses",
                            "anos"
                        ],
                        "x-enum-rotulos": {
                            "dias": "dias",
                            "meses": "meses",
                            "anos": "anos"
                        },
                        "default": "anos"
                    },
                    "anos": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Equivalente em anos",
                        "x-unidade": "anos",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "acao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "No fim do prazo",
                        "enum": [
                            "anonimizar",
                            "eliminar",
                            "rever"
                        ],
                        "x-enum-rotulos": {
                            "anonimizar": "Anonimizar",
                            "eliminar": "Eliminar",
                            "rever": "Rever"
                        }
                    },
                    "base_legal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fundamento jurídico",
                        "maxLength": 255
                    },
                    "automatica": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Automática",
                        "description": "Desligada, o sistema só cria uma tarefa de revisão com o número de registos fora do prazo.",
                        "default": 1
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    },
                    "ultima_execucao_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Última execução",
                        "readOnly": true
                    },
                    "ultimo_resultado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Último resultado",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-clinico": false
            },
            "Recurso_conservacao_regras_Entrada": {
                "type": "object",
                "properties": {
                    "categoria": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Categoria",
                        "enum": [
                            "processo_clinico",
                            "leads_nao_convertidos",
                            "gravacoes_chamadas",
                            "imagens_bruto",
                            "auditoria",
                            "pedidos_titulares",
                            "alertas_acesso",
                            "documentos_anulados",
                            "reclamacoes",
                            "faturacao"
                        ],
                        "x-enum-rotulos": {
                            "processo_clinico": "Processo clínico",
                            "leads_nao_convertidos": "Contactos não convertidos",
                            "gravacoes_chamadas": "Gravações de chamadas",
                            "imagens_bruto": "Imagens em bruto",
                            "auditoria": "Registo de auditoria",
                            "pedidos_titulares": "Pedidos dos titulares",
                            "alertas_acesso": "Alertas de acesso",
                            "documentos_anulados": "Documentos anulados",
                            "reclamacoes": "Reclamações",
                            "faturacao": "Faturação"
                        }
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 500
                    },
                    "prazo": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Prazo",
                        "maximum": 1200,
                        "minimum": 1
                    },
                    "unidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Unidade",
                        "enum": [
                            "dias",
                            "meses",
                            "anos"
                        ],
                        "x-enum-rotulos": {
                            "dias": "dias",
                            "meses": "meses",
                            "anos": "anos"
                        },
                        "default": "anos"
                    },
                    "acao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "No fim do prazo",
                        "enum": [
                            "anonimizar",
                            "eliminar",
                            "rever"
                        ],
                        "x-enum-rotulos": {
                            "anonimizar": "Anonimizar",
                            "eliminar": "Eliminar",
                            "rever": "Rever"
                        }
                    },
                    "base_legal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fundamento jurídico",
                        "maxLength": 255
                    },
                    "automatica": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Automática",
                        "description": "Desligada, o sistema só cria uma tarefa de revisão com o número de registos fora do prazo.",
                        "default": 1
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    }
                },
                "required": [
                    "categoria",
                    "prazo",
                    "unidade",
                    "acao"
                ]
            },
            "Recurso_consultas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes",
                        "readOnly": true
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Episódio",
                        "x-anagen-recurso": "episodios",
                        "readOnly": true
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Data",
                        "readOnly": true
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo de consulta",
                        "enum": [
                            "primeira",
                            "avaliacao",
                            "controlo",
                            "teleconsulta",
                            "pre_operatoria"
                        ],
                        "x-enum-rotulos": {
                            "primeira": "Primeira consulta",
                            "avaliacao": "Avaliação",
                            "controlo": "Controlo",
                            "teleconsulta": "Teleconsulta",
                            "pre_operatoria": "Pré-operatória"
                        },
                        "readOnly": true
                    },
                    "medico_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Médico",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "rascunho",
                            "assinada"
                        ],
                        "x-enum-rotulos": {
                            "rascunho": "Rascunho",
                            "assinada": "Assinada"
                        },
                        "readOnly": true
                    },
                    "elegibilidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Elegibilidade",
                        "enum": [
                            "por_avaliar",
                            "apto",
                            "apto_condicional",
                            "nao_apto"
                        ],
                        "x-enum-rotulos": {
                            "por_avaliar": "Por avaliar",
                            "apto": "Apto",
                            "apto_condicional": "Apto com condições",
                            "nao_apto": "Não apto"
                        },
                        "readOnly": true
                    },
                    "escala": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Escala",
                        "enum": [
                            "norwood",
                            "ludwig",
                            "savin",
                            "sinclair",
                            "basp",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "norwood": "Norwood-Hamilton",
                            "ludwig": "Ludwig",
                            "savin": "Savin",
                            "sinclair": "Sinclair",
                            "basp": "BASP",
                            "outra": "Outra"
                        },
                        "readOnly": true
                    },
                    "grau": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Grau",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "basp": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Classificação BASP",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "precise_pontuacao": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Pontuação PRECISE",
                        "x-casas": 1,
                        "readOnly": true
                    },
                    "miniaturizacao_dadora_pct": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Miniaturização na zona dadora",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 1,
                        "readOnly": true
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Técnica",
                        "enum": [
                            "FUE",
                            "FUT",
                            "DHI",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "FUE": "FUE",
                            "FUT": "FUT",
                            "DHI": "DHI",
                            "outra": "Outra"
                        },
                        "readOnly": true
                    },
                    "viabilidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Viabilidade",
                        "enum": [
                            "viavel",
                            "condicional",
                            "nao_viavel"
                        ],
                        "x-enum-rotulos": {
                            "viavel": "Viável",
                            "condicional": "Viável com condições",
                            "nao_viavel": "Não viável"
                        },
                        "readOnly": true
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo da consulta",
                        "x-anagen-cifrado": "clinico",
                        "readOnly": true
                    },
                    "antecedentes": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Antecedentes pessoais",
                        "x-anagen-cifrado": "clinico",
                        "readOnly": true
                    },
                    "medicacao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Medicação atual",
                        "x-anagen-cifrado": "clinico",
                        "readOnly": true
                    },
                    "alergias": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Alergias",
                        "x-anagen-cifrado": "clinico",
                        "readOnly": true
                    },
                    "habitos": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Hábitos",
                        "x-anagen-cifrado": "clinico",
                        "readOnly": true
                    },
                    "historia_familiar": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "História familiar",
                        "x-anagen-cifrado": "clinico",
                        "readOnly": true
                    },
                    "expectativas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Expectativas",
                        "x-anagen-cifrado": "clinico",
                        "readOnly": true
                    },
                    "exame": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Exame objetivo",
                        "x-anagen-cifrado": "clinico",
                        "readOnly": true
                    },
                    "diagnostico": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Diagnóstico",
                        "x-anagen-cifrado": "clinico",
                        "readOnly": true
                    },
                    "diagnostico_diferencial": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Diagnóstico diferencial",
                        "x-anagen-cifrado": "clinico",
                        "readOnly": true
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas clínicas",
                        "x-anagen-cifrado": "clinico",
                        "readOnly": true
                    },
                    "assinada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Assinada em",
                        "readOnly": true
                    },
                    "impressao_digital": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Impressão digital do registo",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-clinico": true
            },
            "Recurso_consultas_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_contas_pagadoras": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 190
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "empresa",
                            "familiar",
                            "seguradora",
                            "subsistema",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "empresa": "Empresa",
                            "familiar": "Familiar",
                            "seguradora": "Seguradora",
                            "subsistema": "Subsistema de saúde",
                            "outro": "Outro"
                        },
                        "default": "empresa"
                    },
                    "nif": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{9}$",
                        "title": "NIF",
                        "x-anagen-cifrado": "geral"
                    },
                    "email": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "email",
                        "title": "Email",
                        "maxLength": 190
                    },
                    "telefone": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Telefone"
                    },
                    "morada": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Morada",
                        "maxLength": 255
                    },
                    "codigo_postal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{4}-\\d{3}$",
                        "title": "Código postal"
                    },
                    "localidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Localidade",
                        "maxLength": 100
                    },
                    "pais": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "País",
                        "maxLength": 60,
                        "default": "Portugal"
                    },
                    "faturar_ao_pagador": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Faturar ao pagador",
                        "description": "O documento fiscal da parte do pagador sai em nome desta conta.",
                        "default": 1
                    },
                    "entidade_publica": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Entidade pública",
                        "description": "Exige fatura eletrónica CIUS-PT; o documento fica com a entrega por registar.",
                        "default": 0
                    },
                    "prazo_pagamento_dias": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Prazo de pagamento (dias)",
                        "maximum": 365,
                        "minimum": 0,
                        "default": 30
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 4000
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-clinico": false
            },
            "Recurso_contas_pagadoras_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 190
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "empresa",
                            "familiar",
                            "seguradora",
                            "subsistema",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "empresa": "Empresa",
                            "familiar": "Familiar",
                            "seguradora": "Seguradora",
                            "subsistema": "Subsistema de saúde",
                            "outro": "Outro"
                        },
                        "default": "empresa"
                    },
                    "nif": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{9}$",
                        "title": "NIF",
                        "x-anagen-cifrado": "geral"
                    },
                    "email": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "email",
                        "title": "Email",
                        "maxLength": 190
                    },
                    "telefone": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Telefone"
                    },
                    "morada": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Morada",
                        "maxLength": 255
                    },
                    "codigo_postal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{4}-\\d{3}$",
                        "title": "Código postal"
                    },
                    "localidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Localidade",
                        "maxLength": 100
                    },
                    "pais": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "País",
                        "maxLength": 60,
                        "default": "Portugal"
                    },
                    "faturar_ao_pagador": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Faturar ao pagador",
                        "description": "O documento fiscal da parte do pagador sai em nome desta conta.",
                        "default": 1
                    },
                    "entidade_publica": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Entidade pública",
                        "description": "Exige fatura eletrónica CIUS-PT; o documento fica com a entrega por registar.",
                        "default": 0
                    },
                    "prazo_pagamento_dias": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Prazo de pagamento (dias)",
                        "maximum": 365,
                        "minimum": 0,
                        "default": 30
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 4000
                    }
                },
                "required": [
                    "nome",
                    "tipo"
                ]
            },
            "Recurso_contas_subcontas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "conta_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Conta pagadora",
                        "x-anagen-recurso": "contas_pagadoras"
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "relacao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Relação",
                        "enum": [
                            "titular",
                            "colaborador",
                            "conjuge",
                            "filho",
                            "beneficiario",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "titular": "Titular",
                            "colaborador": "Colaborador(a)",
                            "conjuge": "Cônjuge",
                            "filho": "Filho(a)",
                            "beneficiario": "Beneficiário(a)",
                            "outro": "Outra"
                        },
                        "default": "beneficiario"
                    },
                    "numero_beneficiario": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "N.º de beneficiário",
                        "description": "Guardado cifrado. Aparece nas faturas emitidas à conta.",
                        "maxLength": 60,
                        "x-anagen-cifrado": "geral"
                    },
                    "cobertura_pct": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Cobertura do pagador (%)",
                        "description": "Percentagem de cada ato paga pela conta; o resto é do paciente.",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2,
                        "default": 100
                    },
                    "limite": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Limite anual",
                        "description": "Vazio = sem limite. Acima do limite, o valor passa para o paciente.",
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "valida_desde": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válida desde"
                    },
                    "valida_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válida até"
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 2000
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-clinico": false
            },
            "Recurso_contas_subcontas_Entrada": {
                "type": "object",
                "properties": {
                    "conta_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Conta pagadora",
                        "x-anagen-recurso": "contas_pagadoras"
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "relacao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Relação",
                        "enum": [
                            "titular",
                            "colaborador",
                            "conjuge",
                            "filho",
                            "beneficiario",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "titular": "Titular",
                            "colaborador": "Colaborador(a)",
                            "conjuge": "Cônjuge",
                            "filho": "Filho(a)",
                            "beneficiario": "Beneficiário(a)",
                            "outro": "Outra"
                        },
                        "default": "beneficiario"
                    },
                    "numero_beneficiario": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "N.º de beneficiário",
                        "description": "Guardado cifrado. Aparece nas faturas emitidas à conta.",
                        "maxLength": 60,
                        "x-anagen-cifrado": "geral"
                    },
                    "cobertura_pct": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Cobertura do pagador (%)",
                        "description": "Percentagem de cada ato paga pela conta; o resto é do paciente.",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2,
                        "default": 100
                    },
                    "limite": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Limite anual",
                        "description": "Vazio = sem limite. Acima do limite, o valor passa para o paciente.",
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "valida_desde": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válida desde"
                    },
                    "valida_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válida até"
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 2000
                    }
                },
                "required": [
                    "conta_id",
                    "paciente_id"
                ]
            },
            "Recurso_convencoes": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "seguro",
                            "subsistema",
                            "convencao",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "seguro": "Seguro de saúde",
                            "subsistema": "Subsistema",
                            "convencao": "Convenção",
                            "outro": "Outro acordo"
                        },
                        "default": "seguro"
                    },
                    "conta_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Entidade (conta pagadora)",
                        "description": "Recebe a fatura da sua parte. Os beneficiários são as subcontas desta conta.",
                        "x-anagen-recurso": "contas_pagadoras"
                    },
                    "codigo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Código do acordo",
                        "maxLength": 40
                    },
                    "exige_autorizacao": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Exige autorização prévia",
                        "description": "Pede o n.º de autorização da entidade em cada ato.",
                        "default": 0
                    },
                    "valida_desde": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válida desde"
                    },
                    "valida_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válida até"
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 4000
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-clinico": false
            },
            "Recurso_convencoes_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "seguro",
                            "subsistema",
                            "convencao",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "seguro": "Seguro de saúde",
                            "subsistema": "Subsistema",
                            "convencao": "Convenção",
                            "outro": "Outro acordo"
                        },
                        "default": "seguro"
                    },
                    "conta_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Entidade (conta pagadora)",
                        "description": "Recebe a fatura da sua parte. Os beneficiários são as subcontas desta conta.",
                        "x-anagen-recurso": "contas_pagadoras"
                    },
                    "codigo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Código do acordo",
                        "maxLength": 40
                    },
                    "exige_autorizacao": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Exige autorização prévia",
                        "description": "Pede o n.º de autorização da entidade em cada ato.",
                        "default": 0
                    },
                    "valida_desde": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válida desde"
                    },
                    "valida_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válida até"
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 4000
                    }
                },
                "required": [
                    "nome",
                    "tipo",
                    "conta_id"
                ]
            },
            "Recurso_convencoes_atos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "convencao_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Convenção",
                        "x-anagen-recurso": "convencoes"
                    },
                    "procedimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Procedimento",
                        "x-anagen-recurso": "procedimentos"
                    },
                    "codigo_ato": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Código do ato na entidade",
                        "maxLength": 40
                    },
                    "preco": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Preço convencionado",
                        "description": "Vazio = o valor indicado no momento.",
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "comparticipacao_tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Comparticipação",
                        "enum": [
                            "percentagem",
                            "fixo"
                        ],
                        "x-enum-rotulos": {
                            "percentagem": "Percentagem",
                            "fixo": "Valor fixo"
                        },
                        "default": "percentagem"
                    },
                    "comparticipacao_pct": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Percentagem da entidade",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2
                    },
                    "comparticipacao_valor": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Valor da entidade",
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "limite_anual": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Limite por beneficiário e ano",
                        "description": "Número de atos comparticipados por ano. Vazio = sem limite.",
                        "maximum": 999,
                        "minimum": 1
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 500
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-clinico": false
            },
            "Recurso_convencoes_atos_Entrada": {
                "type": "object",
                "properties": {
                    "convencao_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Convenção",
                        "x-anagen-recurso": "convencoes"
                    },
                    "procedimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Procedimento",
                        "x-anagen-recurso": "procedimentos"
                    },
                    "codigo_ato": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Código do ato na entidade",
                        "maxLength": 40
                    },
                    "preco": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Preço convencionado",
                        "description": "Vazio = o valor indicado no momento.",
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "comparticipacao_tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Comparticipação",
                        "enum": [
                            "percentagem",
                            "fixo"
                        ],
                        "x-enum-rotulos": {
                            "percentagem": "Percentagem",
                            "fixo": "Valor fixo"
                        },
                        "default": "percentagem"
                    },
                    "comparticipacao_pct": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Percentagem da entidade",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2
                    },
                    "comparticipacao_valor": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Valor da entidade",
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "limite_anual": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Limite por beneficiário e ano",
                        "description": "Número de atos comparticipados por ano. Vazio = sem limite.",
                        "maximum": 999,
                        "minimum": 1
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 500
                    }
                },
                "required": [
                    "convencao_id",
                    "procedimento_id",
                    "comparticipacao_tipo"
                ]
            },
            "Recurso_conversas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal",
                        "enum": [
                            "portal",
                            "whatsapp",
                            "instagram",
                            "messenger",
                            "email",
                            "chat_site",
                            "sms"
                        ],
                        "x-enum-rotulos": {
                            "portal": "Portal",
                            "whatsapp": "WhatsApp",
                            "instagram": "Instagram",
                            "messenger": "Messenger",
                            "email": "Email",
                            "chat_site": "Chat do site",
                            "sms": "SMS"
                        },
                        "readOnly": true
                    },
                    "contacto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Contacto",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "assunto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Assunto",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes",
                        "readOnly": true
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Lead",
                        "x-anagen-recurso": "leads",
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "aberta",
                            "pendente",
                            "resolvida"
                        ],
                        "x-enum-rotulos": {
                            "aberta": "Aberta",
                            "pendente": "A aguardar resposta",
                            "resolvida": "Resolvida"
                        }
                    },
                    "departamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Departamento",
                        "enum": [
                            "administracao",
                            "medico",
                            "enfermagem",
                            "tecnico",
                            "comercial",
                            "rececao"
                        ],
                        "x-enum-rotulos": {
                            "administracao": "Administração",
                            "medico": "Médico",
                            "enfermagem": "Enfermagem",
                            "tecnico": "Técnico",
                            "comercial": "Comercial",
                            "rececao": "Receção"
                        }
                    },
                    "atribuida_a": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Atribuída a",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "ia_a_tratar": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "IA a tratar",
                        "readOnly": true
                    },
                    "sla_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Responder até",
                        "readOnly": true
                    },
                    "primeira_resposta_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Primeira resposta",
                        "readOnly": true
                    },
                    "ultima_mensagem_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Última mensagem",
                        "readOnly": true
                    },
                    "avaliacao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Avaliação (1–5)",
                        "readOnly": true
                    },
                    "avaliacao_comentario": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Comentário do supervisor",
                        "maxLength": 2000
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-clinico": false
            },
            "Recurso_conversas_Entrada": {
                "type": "object",
                "properties": {
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "aberta",
                            "pendente",
                            "resolvida"
                        ],
                        "x-enum-rotulos": {
                            "aberta": "Aberta",
                            "pendente": "A aguardar resposta",
                            "resolvida": "Resolvida"
                        }
                    },
                    "departamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Departamento",
                        "enum": [
                            "administracao",
                            "medico",
                            "enfermagem",
                            "tecnico",
                            "comercial",
                            "rececao"
                        ],
                        "x-enum-rotulos": {
                            "administracao": "Administração",
                            "medico": "Médico",
                            "enfermagem": "Enfermagem",
                            "tecnico": "Técnico",
                            "comercial": "Comercial",
                            "rececao": "Receção"
                        }
                    },
                    "atribuida_a": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Atribuída a",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "avaliacao_comentario": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Comentário do supervisor",
                        "maxLength": 2000
                    }
                }
            },
            "Recurso_cuidados_conteudos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 190
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "video",
                            "artigo"
                        ],
                        "x-enum-rotulos": {
                            "video": "Vídeo",
                            "artigo": "Artigo"
                        },
                        "default": "video"
                    },
                    "dia": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Disponível no dia",
                        "description": "Dias depois da cirurgia (0 = dia da cirurgia; 1, 3, 7, 10, 30…).",
                        "maximum": 730,
                        "minimum": 0,
                        "default": 0
                    },
                    "resumo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resumo",
                        "maxLength": 500
                    },
                    "video_ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Vídeo",
                        "description": "Vídeo da própria clínica (sem leitores externos)."
                    },
                    "duracao_segundos": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Duração",
                        "maximum": 7200,
                        "minimum": 1,
                        "x-unidade": "s"
                    },
                    "corpo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Texto",
                        "description": "Instruções claras, sem prescrições individuais."
                    },
                    "procedimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Procedimento",
                        "description": "Vazio = todos os procedimentos.",
                        "x-anagen-recurso": "procedimentos"
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "todos",
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "todos": "Todas as línguas",
                            "pt-PT": "Português (Portugal)",
                            "pt-BR": "Português (Brasil)",
                            "en": "English",
                            "es": "Español",
                            "fr": "Français",
                            "de": "Deutsch"
                        },
                        "default": "todos"
                    },
                    "notificar": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Avisar o paciente",
                        "description": "Envia um aviso quando o conteúdo fica disponível.",
                        "default": 1
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 999,
                        "minimum": 0,
                        "default": 0
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "rascunho",
                            "por_aprovar",
                            "aprovado",
                            "retirado"
                        ],
                        "x-enum-rotulos": {
                            "rascunho": "Rascunho",
                            "por_aprovar": "Por aprovar",
                            "aprovado": "Aprovado",
                            "retirado": "Retirado"
                        },
                        "readOnly": true
                    },
                    "versao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Versão",
                        "readOnly": true
                    },
                    "aprovado_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Aprovado por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "aprovado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Aprovado em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-clinico": false
            },
            "Recurso_cuidados_conteudos_Entrada": {
                "type": "object",
                "properties": {
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 190
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "video",
                            "artigo"
                        ],
                        "x-enum-rotulos": {
                            "video": "Vídeo",
                            "artigo": "Artigo"
                        },
                        "default": "video"
                    },
                    "dia": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Disponível no dia",
                        "description": "Dias depois da cirurgia (0 = dia da cirurgia; 1, 3, 7, 10, 30…).",
                        "maximum": 730,
                        "minimum": 0,
                        "default": 0
                    },
                    "resumo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resumo",
                        "maxLength": 500
                    },
                    "video_ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Vídeo",
                        "description": "Vídeo da própria clínica (sem leitores externos)."
                    },
                    "duracao_segundos": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Duração",
                        "maximum": 7200,
                        "minimum": 1,
                        "x-unidade": "s"
                    },
                    "corpo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Texto",
                        "description": "Instruções claras, sem prescrições individuais."
                    },
                    "procedimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Procedimento",
                        "description": "Vazio = todos os procedimentos.",
                        "x-anagen-recurso": "procedimentos"
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "todos",
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "todos": "Todas as línguas",
                            "pt-PT": "Português (Portugal)",
                            "pt-BR": "Português (Brasil)",
                            "en": "English",
                            "es": "Español",
                            "fr": "Français",
                            "de": "Deutsch"
                        },
                        "default": "todos"
                    },
                    "notificar": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Avisar o paciente",
                        "description": "Envia um aviso quando o conteúdo fica disponível.",
                        "default": 1
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 999,
                        "minimum": 0,
                        "default": 0
                    }
                },
                "required": [
                    "titulo",
                    "dia"
                ]
            },
            "Recurso_custos_anuncios": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "plataforma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Plataforma",
                        "enum": [
                            "meta",
                            "google",
                            "tiktok",
                            "linkedin",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "meta": "Meta",
                            "google": "Google",
                            "tiktok": "TikTok",
                            "linkedin": "LinkedIn",
                            "outra": "Outra"
                        }
                    },
                    "campanha": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Campanha",
                        "description": "Igual ao «utm_campaign» ou à campanha dos leads, para cruzar resultados.",
                        "maxLength": 120
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data"
                    },
                    "custo": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Custo",
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "impressoes": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Impressões",
                        "minimum": 0
                    },
                    "cliques": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Cliques",
                        "minimum": 0
                    },
                    "leads": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Leads na plataforma",
                        "description": "Indicado pela plataforma; os leads reais contam-se no AnagenSys.",
                        "minimum": 0
                    },
                    "importacao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Importação",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-clinico": false
            },
            "Recurso_custos_anuncios_Entrada": {
                "type": "object",
                "properties": {
                    "plataforma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Plataforma",
                        "enum": [
                            "meta",
                            "google",
                            "tiktok",
                            "linkedin",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "meta": "Meta",
                            "google": "Google",
                            "tiktok": "TikTok",
                            "linkedin": "LinkedIn",
                            "outra": "Outra"
                        }
                    },
                    "campanha": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Campanha",
                        "description": "Igual ao «utm_campaign» ou à campanha dos leads, para cruzar resultados.",
                        "maxLength": 120
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data"
                    },
                    "custo": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Custo",
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "impressoes": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Impressões",
                        "minimum": 0
                    },
                    "cliques": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Cliques",
                        "minimum": 0
                    },
                    "leads": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Leads na plataforma",
                        "description": "Indicado pela plataforma; os leads reais contam-se no AnagenSys.",
                        "minimum": 0
                    }
                },
                "required": [
                    "plataforma",
                    "campanha",
                    "data",
                    "custo"
                ]
            },
            "Recurso_datas_especiais": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Data",
                        "description": "O aniversário da cirurgia usa um dado clínico: só segue para quem deu consentimento explícito de marketing.",
                        "enum": [
                            "aniversario",
                            "aniversario_cirurgia"
                        ],
                        "x-enum-rotulos": {
                            "aniversario": "Aniversário",
                            "aniversario_cirurgia": "Aniversário da cirurgia"
                        },
                        "default": "aniversario"
                    },
                    "campanha_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Campanha",
                        "description": "Campanha do tipo «Data especial», aprovada pela direção clínica.",
                        "x-anagen-recurso": "campanhas"
                    },
                    "publico": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Para",
                        "enum": [
                            "pacientes",
                            "leads",
                            "todos"
                        ],
                        "x-enum-rotulos": {
                            "pacientes": "Pacientes",
                            "leads": "Leads",
                            "todos": "Pacientes e leads"
                        },
                        "default": "pacientes"
                    },
                    "dias_antes": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Dias de antecedência",
                        "description": "0 = no próprio dia.",
                        "maximum": 30,
                        "minimum": 0,
                        "default": 0
                    },
                    "hora": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{2}:\\d{2}$",
                        "title": "Hora de envio",
                        "default": "10:00"
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "description": "Só com a campanha aprovada.",
                        "default": 0
                    },
                    "enviados": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Enviadas",
                        "readOnly": true
                    },
                    "bloqueados": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Não enviadas",
                        "readOnly": true
                    },
                    "ultimo_processamento_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Último processamento",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-clinico": false
            },
            "Recurso_datas_especiais_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Data",
                        "description": "O aniversário da cirurgia usa um dado clínico: só segue para quem deu consentimento explícito de marketing.",
                        "enum": [
                            "aniversario",
                            "aniversario_cirurgia"
                        ],
                        "x-enum-rotulos": {
                            "aniversario": "Aniversário",
                            "aniversario_cirurgia": "Aniversário da cirurgia"
                        },
                        "default": "aniversario"
                    },
                    "campanha_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Campanha",
                        "description": "Campanha do tipo «Data especial», aprovada pela direção clínica.",
                        "x-anagen-recurso": "campanhas"
                    },
                    "publico": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Para",
                        "enum": [
                            "pacientes",
                            "leads",
                            "todos"
                        ],
                        "x-enum-rotulos": {
                            "pacientes": "Pacientes",
                            "leads": "Leads",
                            "todos": "Pacientes e leads"
                        },
                        "default": "pacientes"
                    },
                    "dias_antes": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Dias de antecedência",
                        "description": "0 = no próprio dia.",
                        "maximum": 30,
                        "minimum": 0,
                        "default": 0
                    },
                    "hora": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{2}:\\d{2}$",
                        "title": "Hora de envio",
                        "default": "10:00"
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "description": "Só com a campanha aprovada.",
                        "default": 0
                    }
                },
                "required": [
                    "nome",
                    "tipo",
                    "campanha_id"
                ]
            },
            "Recurso_delegacoes": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "de_utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Quem delega",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "para_utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Quem recebe",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Início"
                    },
                    "fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Fim",
                        "description": "No máximo 90 dias depois do início."
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo",
                        "maxLength": 255
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-clinico": false
            },
            "Recurso_delegacoes_Entrada": {
                "type": "object",
                "properties": {
                    "de_utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Quem delega",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "para_utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Quem recebe",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Início"
                    },
                    "fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Fim",
                        "description": "No máximo 90 dias depois do início."
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo",
                        "maxLength": 255
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    }
                },
                "required": [
                    "de_utilizador_id",
                    "para_utilizador_id",
                    "inicio",
                    "fim"
                ]
            },
            "Recurso_diagnosticos_apoio": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Diagnóstico",
                        "maxLength": 160
                    },
                    "codigo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Código",
                        "description": "Código CID-10 ou SNOMED CT, opcional. Segue no resumo em formato europeu.",
                        "maxLength": 30
                    },
                    "sistema": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Terminologia",
                        "enum": [
                            "icd10",
                            "snomed",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "icd10": "CID-10",
                            "snomed": "SNOMED CT",
                            "outro": "Outra"
                        }
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Orientação",
                        "description": "Critérios ou sinais que ajudam a considerar este diagnóstico (mostrados na consulta).",
                        "maxLength": 600
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 10000,
                        "minimum": 0,
                        "default": 100
                    },
                    "chave": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Chave",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "rascunho",
                            "aprovada",
                            "arquivada"
                        ],
                        "x-enum-rotulos": {
                            "rascunho": "Rascunho",
                            "aprovada": "Aprovada",
                            "arquivada": "Arquivada"
                        },
                        "readOnly": true
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "readOnly": true
                    },
                    "versao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Versão",
                        "readOnly": true
                    },
                    "aprovado_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Aprovado por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "aprovado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Aprovado em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-clinico": false
            },
            "Recurso_diagnosticos_apoio_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Diagnóstico",
                        "maxLength": 160
                    },
                    "codigo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Código",
                        "description": "Código CID-10 ou SNOMED CT, opcional. Segue no resumo em formato europeu.",
                        "maxLength": 30
                    },
                    "sistema": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Terminologia",
                        "enum": [
                            "icd10",
                            "snomed",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "icd10": "CID-10",
                            "snomed": "SNOMED CT",
                            "outro": "Outra"
                        }
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Orientação",
                        "description": "Critérios ou sinais que ajudam a considerar este diagnóstico (mostrados na consulta).",
                        "maxLength": 600
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 10000,
                        "minimum": 0,
                        "default": 100
                    }
                },
                "required": [
                    "nome"
                ]
            },
            "Recurso_documento_modelos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 200
                    },
                    "chave": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Chave",
                        "description": "Identificador estável do modelo (letras minúsculas, algarismos e «_»). As novas versões mantêm a mesma chave.",
                        "maxLength": 60,
                        "pattern": "^[a-z][a-z0-9_]{2,59}$"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "proposta",
                            "consentimento",
                            "instrucoes",
                            "declaracao",
                            "relatorio",
                            "alta",
                            "carta"
                        ],
                        "x-enum-rotulos": {
                            "proposta": "Proposta",
                            "consentimento": "Consentimento",
                            "instrucoes": "Instruções",
                            "declaracao": "Declaração",
                            "relatorio": "Relatório",
                            "alta": "Alta",
                            "carta": "Carta"
                        }
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 500
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português (Portugal)",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        },
                        "default": "pt-PT"
                    },
                    "clinico": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Conteúdo clínico",
                        "description": "Só quem tem acesso clínico ao paciente vê o conteúdo; aprovação pela direção clínica."
                    },
                    "assinatura": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Pede assinatura do titular",
                        "description": "O documento pode ser assinado no ecrã, com código enviado ao titular ou com assinatura qualificada."
                    },
                    "assinatura_medico": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Pede assinatura do médico"
                    },
                    "partilhar_padrao": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Partilhar no portal por omissão",
                        "default": 1
                    },
                    "conteudo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Conteúdo",
                        "description": "Use campos entre chavetas duplas, por exemplo {{paciente.nome}}, {{entidade.nome_legal}} ou {{campos.observacoes}}. A lista completa está no ecrã de emissão.",
                        "maxLength": 400000
                    },
                    "campos_extra": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Campos adicionais",
                        "description": "Campos pedidos ao emitir: lista de objetos com «chave», «rotulo», «tipo» (texto, textoLongo, data, numero) e «obrigatorio»."
                    },
                    "versao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Versão",
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "rascunho",
                            "aprovado",
                            "arquivado"
                        ],
                        "x-enum-rotulos": {
                            "rascunho": "Rascunho",
                            "aprovado": "Aprovado",
                            "arquivado": "Arquivado"
                        },
                        "readOnly": true
                    },
                    "revisao_juridica": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Revisto pelo encarregado/jurídico",
                        "description": "Marque depois de o encarregado de proteção de dados ou o jurídico rever o texto. Os textos fornecidos com o sistema chegam por rever."
                    },
                    "aprovado_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Aprovado por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "aprovado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Aprovado em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-clinico": false
            },
            "Recurso_documento_modelos_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 200
                    },
                    "chave": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Chave",
                        "description": "Identificador estável do modelo (letras minúsculas, algarismos e «_»). As novas versões mantêm a mesma chave.",
                        "maxLength": 60,
                        "pattern": "^[a-z][a-z0-9_]{2,59}$"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "proposta",
                            "consentimento",
                            "instrucoes",
                            "declaracao",
                            "relatorio",
                            "alta",
                            "carta"
                        ],
                        "x-enum-rotulos": {
                            "proposta": "Proposta",
                            "consentimento": "Consentimento",
                            "instrucoes": "Instruções",
                            "declaracao": "Declaração",
                            "relatorio": "Relatório",
                            "alta": "Alta",
                            "carta": "Carta"
                        }
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 500
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português (Portugal)",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        },
                        "default": "pt-PT"
                    },
                    "clinico": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Conteúdo clínico",
                        "description": "Só quem tem acesso clínico ao paciente vê o conteúdo; aprovação pela direção clínica."
                    },
                    "assinatura": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Pede assinatura do titular",
                        "description": "O documento pode ser assinado no ecrã, com código enviado ao titular ou com assinatura qualificada."
                    },
                    "assinatura_medico": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Pede assinatura do médico"
                    },
                    "partilhar_padrao": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Partilhar no portal por omissão",
                        "default": 1
                    },
                    "conteudo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Conteúdo",
                        "description": "Use campos entre chavetas duplas, por exemplo {{paciente.nome}}, {{entidade.nome_legal}} ou {{campos.observacoes}}. A lista completa está no ecrã de emissão.",
                        "maxLength": 400000
                    },
                    "campos_extra": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Campos adicionais",
                        "description": "Campos pedidos ao emitir: lista de objetos com «chave», «rotulo», «tipo» (texto, textoLongo, data, numero) e «obrigatorio»."
                    },
                    "revisao_juridica": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Revisto pelo encarregado/jurídico",
                        "description": "Marque depois de o encarregado de proteção de dados ou o jurídico rever o texto. Os textos fornecidos com o sistema chegam por rever."
                    }
                },
                "required": [
                    "nome",
                    "chave",
                    "tipo",
                    "idioma",
                    "conteudo"
                ]
            },
            "Recurso_documentos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "numero": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Número",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "proposta",
                            "consentimento",
                            "instrucoes",
                            "declaracao",
                            "relatorio",
                            "alta",
                            "carta"
                        ],
                        "x-enum-rotulos": {
                            "proposta": "Proposta",
                            "consentimento": "Consentimento",
                            "instrucoes": "Instruções",
                            "declaracao": "Declaração",
                            "relatorio": "Relatório",
                            "alta": "Alta",
                            "carta": "Carta"
                        },
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes",
                        "readOnly": true
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Episódio",
                        "readOnly": true
                    },
                    "modelo_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Modelo",
                        "x-anagen-recurso": "documento_modelos",
                        "readOnly": true
                    },
                    "modelo_versao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Versão",
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "emitido",
                            "enviado",
                            "assinado",
                            "anulado"
                        ],
                        "x-enum-rotulos": {
                            "emitido": "Emitido",
                            "enviado": "Enviado para assinatura",
                            "assinado": "Assinado",
                            "anulado": "Anulado"
                        },
                        "readOnly": true
                    },
                    "assinatura_tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Assinatura",
                        "enum": [
                            "ecra",
                            "codigo",
                            "qualificada"
                        ],
                        "x-enum-rotulos": {
                            "ecra": "No ecrã (presencial)",
                            "codigo": "Com código enviado",
                            "qualificada": "Qualificada"
                        },
                        "readOnly": true
                    },
                    "codigo_verificacao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Código de verificação",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "conteudo_hash": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Impressão digital",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "partilhado_paciente": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Documento partilhado no portal.",
                        "readOnly": true
                    },
                    "enviado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Enviado em",
                        "readOnly": true
                    },
                    "assinado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Assinado em",
                        "readOnly": true
                    },
                    "anulado_motivo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo da anulação",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "documentos",
                "x-anagen-clinico": false
            },
            "Recurso_documentos_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_documentos_fiscais": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "FT",
                            "FR",
                            "RG",
                            "NC",
                            "FS"
                        ],
                        "x-enum-rotulos": {
                            "FT": "Fatura",
                            "FR": "Fatura-recibo",
                            "RG": "Recibo",
                            "NC": "Nota de crédito",
                            "FS": "Fatura simplificada"
                        },
                        "readOnly": true
                    },
                    "numero": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Número",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "pedido",
                            "emitido",
                            "anulado",
                            "erro"
                        ],
                        "x-enum-rotulos": {
                            "pedido": "Em emissão",
                            "emitido": "Emitido",
                            "anulado": "Anulado",
                            "erro": "Com erro"
                        },
                        "readOnly": true
                    },
                    "cliente_nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome do cliente",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "cliente_nif_mascarado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "NIF",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes",
                        "readOnly": true
                    },
                    "descricao_servico": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição do serviço",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "base": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Base",
                        "x-moeda": "EUR",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "iva": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "IVA",
                        "x-moeda": "EUR",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "total": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Total",
                        "x-moeda": "EUR",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "iva_taxa": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Taxa de IVA (%)",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "iva_motivo_isencao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo de isenção",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "atcud": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "ATCUD",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "serie": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Série",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "fornecedor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Programa",
                        "enum": [
                            "invoicexpress",
                            "manual"
                        ],
                        "x-enum-rotulos": {
                            "invoicexpress": "InvoiceXpress",
                            "manual": "Registo manual (outro programa certificado)"
                        },
                        "readOnly": true
                    },
                    "emitido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Emitido em",
                        "readOnly": true
                    },
                    "pdf_ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "PDF",
                        "readOnly": true
                    },
                    "pagamento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Pagamento",
                        "x-anagen-recurso": "pagamentos",
                        "readOnly": true
                    },
                    "documento_origem_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Documento de origem",
                        "x-anagen-recurso": "documentos_fiscais",
                        "readOnly": true
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "erro": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Erro",
                        "maxLength": 255,
                        "x-anagen-permissao": "financeiro.pagamentos",
                        "readOnly": true
                    },
                    "enviado_paciente_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Enviado ao paciente em",
                        "readOnly": true
                    },
                    "conta_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Conta pagadora",
                        "x-anagen-recurso": "contas_pagadoras",
                        "readOnly": true
                    },
                    "eletronica_formato": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Formato da fatura eletrónica",
                        "enum": [
                            "cius_pt",
                            "pdf_assinado"
                        ],
                        "x-enum-rotulos": {
                            "cius_pt": "CIUS-PT",
                            "pdf_assinado": "PDF com assinatura qualificada"
                        },
                        "readOnly": true
                    },
                    "eletronica_estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fatura eletrónica",
                        "enum": [
                            "exigida",
                            "registada",
                            "nao_suportada"
                        ],
                        "x-enum-rotulos": {
                            "exigida": "Por entregar",
                            "registada": "Entregue",
                            "nao_suportada": "Não suportada"
                        },
                        "readOnly": true
                    },
                    "eletronica_referencia": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Referência da entrega",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "eletronica_ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "PDF com assinatura qualificada",
                        "readOnly": true
                    },
                    "eletronica_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Registada em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-clinico": false
            },
            "Recurso_documentos_fiscais_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_encomendas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "numero": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Número",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "fornecedor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fornecedor",
                        "maxLength": 160
                    },
                    "fornecedor_email": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "email",
                        "title": "Email do fornecedor"
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "rascunho",
                            "enviada",
                            "recebida",
                            "cancelada"
                        ],
                        "x-enum-rotulos": {
                            "rascunho": "Rascunho",
                            "enviada": "Enviada",
                            "recebida": "Recebida",
                            "cancelada": "Cancelada"
                        },
                        "readOnly": true
                    },
                    "linhas": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Linhas",
                        "description": "Artigo, quantidade e preço unitário de cada linha."
                    },
                    "total": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Total",
                        "x-moeda": "EUR",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "prevista_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Entrega prevista"
                    },
                    "enviada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Enviada em",
                        "readOnly": true
                    },
                    "recebida_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Recebida em",
                        "readOnly": true
                    },
                    "recebida_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Recebida por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 4000
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-clinico": false
            },
            "Recurso_encomendas_Entrada": {
                "type": "object",
                "properties": {
                    "fornecedor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fornecedor",
                        "maxLength": 160
                    },
                    "fornecedor_email": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "email",
                        "title": "Email do fornecedor"
                    },
                    "linhas": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Linhas",
                        "description": "Artigo, quantidade e preço unitário de cada linha."
                    },
                    "prevista_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Entrega prevista"
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 4000
                    }
                },
                "required": [
                    "fornecedor",
                    "linhas"
                ]
            },
            "Recurso_episodios": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "numero": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "N.º do episódio",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "description": "Por omissão, o nome do procedimento escolhido.",
                        "maxLength": 160
                    },
                    "procedimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Procedimento",
                        "x-anagen-recurso": "procedimentos"
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Técnica",
                        "enum": [
                            "FUE",
                            "FUT",
                            "DHI",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "FUE": "FUE",
                            "FUT": "FUT",
                            "DHI": "DHI",
                            "outra": "Outra"
                        }
                    },
                    "area": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Área",
                        "enum": [
                            "couro_cabeludo",
                            "barba",
                            "sobrancelhas",
                            "feminina",
                            "reparacao",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "couro_cabeludo": "Couro cabeludo",
                            "barba": "Barba",
                            "sobrancelhas": "Sobrancelhas",
                            "feminina": "Alopecia feminina",
                            "reparacao": "Reparação de cirurgia anterior",
                            "outra": "Outra"
                        }
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "avaliacao",
                            "plano",
                            "proposta",
                            "agendado",
                            "pre_operatorio",
                            "cirurgia",
                            "pos_operatorio",
                            "acompanhamento",
                            "concluido",
                            "cancelado"
                        ],
                        "x-enum-rotulos": {
                            "avaliacao": "Avaliação",
                            "plano": "Plano",
                            "proposta": "Proposta",
                            "agendado": "Agendado",
                            "pre_operatorio": "Pré-operatório",
                            "cirurgia": "Cirurgia",
                            "pos_operatorio": "Pós-operatório",
                            "acompanhamento": "Acompanhamento",
                            "concluido": "Concluído",
                            "cancelado": "Cancelado"
                        },
                        "readOnly": true
                    },
                    "etapa_jornada": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Etapa da jornada",
                        "maximum": 9,
                        "minimum": 1,
                        "readOnly": true
                    },
                    "medico_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Médico responsável",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "aberto_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Aberto em",
                        "readOnly": true
                    },
                    "fechado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Fechado em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-clinico": false
            },
            "Recurso_episodios_Entrada": {
                "type": "object",
                "properties": {
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "description": "Por omissão, o nome do procedimento escolhido.",
                        "maxLength": 160
                    },
                    "procedimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Procedimento",
                        "x-anagen-recurso": "procedimentos"
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Técnica",
                        "enum": [
                            "FUE",
                            "FUT",
                            "DHI",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "FUE": "FUE",
                            "FUT": "FUT",
                            "DHI": "DHI",
                            "outra": "Outra"
                        }
                    },
                    "area": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Área",
                        "enum": [
                            "couro_cabeludo",
                            "barba",
                            "sobrancelhas",
                            "feminina",
                            "reparacao",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "couro_cabeludo": "Couro cabeludo",
                            "barba": "Barba",
                            "sobrancelhas": "Sobrancelhas",
                            "feminina": "Alopecia feminina",
                            "reparacao": "Reparação de cirurgia anterior",
                            "outra": "Outra"
                        }
                    },
                    "medico_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Médico responsável",
                        "x-anagen-recurso": "utilizadores"
                    }
                },
                "required": [
                    "paciente_id"
                ]
            },
            "Recurso_episodios_equipa": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Episódio",
                        "x-anagen-recurso": "episodios"
                    },
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Profissional",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "papel": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Papel",
                        "enum": [
                            "medico",
                            "cirurgiao",
                            "enfermeiro",
                            "tecnico",
                            "assistente",
                            "anestesista",
                            "coordenador",
                            "comercial",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "medico": "Médico",
                            "cirurgiao": "Cirurgião",
                            "enfermeiro": "Enfermeiro",
                            "tecnico": "Técnico",
                            "assistente": "Assistente",
                            "anestesista": "Anestesista",
                            "coordenador": "Coordenador",
                            "comercial": "Consultor comercial",
                            "outro": "Outro"
                        }
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Início"
                    },
                    "fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Fim",
                        "description": "Vazio enquanto a participação estiver ativa. Ao terminar, o acesso à ficha clínica cessa."
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-clinico": false
            },
            "Recurso_episodios_equipa_Entrada": {
                "type": "object",
                "properties": {
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Episódio",
                        "x-anagen-recurso": "episodios"
                    },
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Profissional",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "papel": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Papel",
                        "enum": [
                            "medico",
                            "cirurgiao",
                            "enfermeiro",
                            "tecnico",
                            "assistente",
                            "anestesista",
                            "coordenador",
                            "comercial",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "medico": "Médico",
                            "cirurgiao": "Cirurgião",
                            "enfermeiro": "Enfermeiro",
                            "tecnico": "Técnico",
                            "assistente": "Assistente",
                            "anestesista": "Anestesista",
                            "coordenador": "Coordenador",
                            "comercial": "Consultor comercial",
                            "outro": "Outro"
                        }
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Início"
                    },
                    "fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Fim",
                        "description": "Vazio enquanto a participação estiver ativa. Ao terminar, o acesso à ficha clínica cessa."
                    }
                },
                "required": [
                    "episodio_id",
                    "utilizador_id",
                    "papel"
                ]
            },
            "Recurso_equipamentos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "marca": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Marca",
                        "maxLength": 100
                    },
                    "modelo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Modelo",
                        "maxLength": 100
                    },
                    "numero_serie": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Número de série",
                        "maxLength": 100
                    },
                    "dispositivo_medico": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Dispositivo médico",
                        "default": 1
                    },
                    "marcacao_ce": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Marcação CE",
                        "description": "Número do organismo notificado quando aplicável.",
                        "maxLength": 60
                    },
                    "classe": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Classe",
                        "enum": [
                            "I",
                            "Is",
                            "Im",
                            "IIa",
                            "IIb",
                            "III",
                            "nao_dm"
                        ],
                        "x-enum-rotulos": {
                            "I": "Classe I",
                            "Is": "Classe Is (estéril)",
                            "Im": "Classe Im (medição)",
                            "IIa": "Classe IIa",
                            "IIb": "Classe IIb",
                            "III": "Classe III",
                            "nao_dm": "Não é dispositivo médico"
                        }
                    },
                    "fornecedor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fornecedor",
                        "maxLength": 160
                    },
                    "localizacao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Localização",
                        "maxLength": 100
                    },
                    "aquisicao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Aquisição"
                    },
                    "garantia_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Garantia até"
                    },
                    "periodicidade_meses": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Periodicidade da manutenção (meses)",
                        "description": "A próxima manutenção é calculada a partir do último registo.",
                        "maximum": 120,
                        "minimum": 1
                    },
                    "proxima_manutencao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Próxima manutenção"
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "ativo",
                            "manutencao",
                            "inativo",
                            "abatido"
                        ],
                        "x-enum-rotulos": {
                            "ativo": "Ativo",
                            "manutencao": "Em manutenção",
                            "inativo": "Inativo",
                            "abatido": "Abatido"
                        },
                        "default": "ativo"
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 5000
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-clinico": false
            },
            "Recurso_equipamentos_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "marca": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Marca",
                        "maxLength": 100
                    },
                    "modelo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Modelo",
                        "maxLength": 100
                    },
                    "numero_serie": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Número de série",
                        "maxLength": 100
                    },
                    "dispositivo_medico": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Dispositivo médico",
                        "default": 1
                    },
                    "marcacao_ce": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Marcação CE",
                        "description": "Número do organismo notificado quando aplicável.",
                        "maxLength": 60
                    },
                    "classe": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Classe",
                        "enum": [
                            "I",
                            "Is",
                            "Im",
                            "IIa",
                            "IIb",
                            "III",
                            "nao_dm"
                        ],
                        "x-enum-rotulos": {
                            "I": "Classe I",
                            "Is": "Classe Is (estéril)",
                            "Im": "Classe Im (medição)",
                            "IIa": "Classe IIa",
                            "IIb": "Classe IIb",
                            "III": "Classe III",
                            "nao_dm": "Não é dispositivo médico"
                        }
                    },
                    "fornecedor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fornecedor",
                        "maxLength": 160
                    },
                    "localizacao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Localização",
                        "maxLength": 100
                    },
                    "aquisicao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Aquisição"
                    },
                    "garantia_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Garantia até"
                    },
                    "periodicidade_meses": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Periodicidade da manutenção (meses)",
                        "description": "A próxima manutenção é calculada a partir do último registo.",
                        "maximum": 120,
                        "minimum": 1
                    },
                    "proxima_manutencao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Próxima manutenção"
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "ativo",
                            "manutencao",
                            "inativo",
                            "abatido"
                        ],
                        "x-enum-rotulos": {
                            "ativo": "Ativo",
                            "manutencao": "Em manutenção",
                            "inativo": "Inativo",
                            "abatido": "Abatido"
                        },
                        "default": "ativo"
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 5000
                    }
                },
                "required": [
                    "nome"
                ]
            },
            "Recurso_equipamentos_registos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "equipamento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Equipamento",
                        "x-anagen-recurso": "equipamentos"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "manutencao",
                            "calibracao",
                            "incidente",
                            "verificacao"
                        ],
                        "x-enum-rotulos": {
                            "manutencao": "Manutenção",
                            "calibracao": "Calibração",
                            "incidente": "Incidente",
                            "verificacao": "Verificação"
                        }
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data"
                    },
                    "resultado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resultado",
                        "enum": [
                            "conforme",
                            "nao_conforme",
                            "pendente"
                        ],
                        "x-enum-rotulos": {
                            "conforme": "Conforme",
                            "nao_conforme": "Não conforme",
                            "pendente": "Pendente"
                        }
                    },
                    "entidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Entidade que executou",
                        "maxLength": 160
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Responsável",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 10000
                    },
                    "proxima_data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Próxima data",
                        "description": "Em branco, é calculada pela periodicidade do equipamento."
                    },
                    "notificado_infarmed": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Notificado ao Infarmed"
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Relatório"
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-clinico": false
            },
            "Recurso_equipamentos_registos_Entrada": {
                "type": "object",
                "properties": {
                    "equipamento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Equipamento",
                        "x-anagen-recurso": "equipamentos"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "manutencao",
                            "calibracao",
                            "incidente",
                            "verificacao"
                        ],
                        "x-enum-rotulos": {
                            "manutencao": "Manutenção",
                            "calibracao": "Calibração",
                            "incidente": "Incidente",
                            "verificacao": "Verificação"
                        }
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data"
                    },
                    "resultado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resultado",
                        "enum": [
                            "conforme",
                            "nao_conforme",
                            "pendente"
                        ],
                        "x-enum-rotulos": {
                            "conforme": "Conforme",
                            "nao_conforme": "Não conforme",
                            "pendente": "Pendente"
                        }
                    },
                    "entidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Entidade que executou",
                        "maxLength": 160
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Responsável",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 10000
                    },
                    "proxima_data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Próxima data",
                        "description": "Em branco, é calculada pela periodicidade do equipamento."
                    },
                    "notificado_infarmed": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Notificado ao Infarmed"
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Relatório"
                    }
                },
                "required": [
                    "equipamento_id",
                    "tipo",
                    "data"
                ]
            },
            "Recurso_equipas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "departamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Departamento",
                        "enum": [
                            "administracao",
                            "medico",
                            "enfermagem",
                            "tecnico",
                            "comercial",
                            "rececao"
                        ],
                        "x-enum-rotulos": {
                            "administracao": "Administração",
                            "medico": "Médico",
                            "enfermagem": "Enfermagem",
                            "tecnico": "Técnico",
                            "comercial": "Comercial",
                            "rececao": "Receção"
                        }
                    },
                    "chefe_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Chefe de equipa",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "membros": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "title": "Membros",
                        "description": "O chefe de equipa conta sempre como membro.",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-clinico": false
            },
            "Recurso_equipas_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "departamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Departamento",
                        "enum": [
                            "administracao",
                            "medico",
                            "enfermagem",
                            "tecnico",
                            "comercial",
                            "rececao"
                        ],
                        "x-enum-rotulos": {
                            "administracao": "Administração",
                            "medico": "Médico",
                            "enfermagem": "Enfermagem",
                            "tecnico": "Técnico",
                            "comercial": "Comercial",
                            "rececao": "Receção"
                        }
                    },
                    "chefe_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Chefe de equipa",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "membros": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "title": "Membros",
                        "description": "O chefe de equipa conta sempre como membro.",
                        "x-anagen-recurso": "utilizadores"
                    }
                },
                "required": [
                    "nome"
                ]
            },
            "Recurso_feriados": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data"
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "ambito": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Âmbito",
                        "enum": [
                            "nacional",
                            "municipal",
                            "clinica"
                        ],
                        "x-enum-rotulos": {
                            "nacional": "Nacional",
                            "municipal": "Municipal",
                            "clinica": "Da clínica"
                        },
                        "default": "nacional"
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-clinico": false
            },
            "Recurso_feriados_Entrada": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data"
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "ambito": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Âmbito",
                        "enum": [
                            "nacional",
                            "municipal",
                            "clinica"
                        ],
                        "x-enum-rotulos": {
                            "nacional": "Nacional",
                            "municipal": "Municipal",
                            "clinica": "Da clínica"
                        },
                        "default": "nacional"
                    }
                },
                "required": [
                    "data",
                    "nome"
                ]
            },
            "Recurso_formacoes": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Pessoa",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "tema": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tema",
                        "enum": [
                            "protecao_dados",
                            "ia",
                            "sigilo",
                            "captura_3d",
                            "seguranca_informacao",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "protecao_dados": "Proteção de dados",
                            "ia": "Inteligência artificial",
                            "sigilo": "Sigilo profissional",
                            "captura_3d": "Captura 3D",
                            "seguranca_informacao": "Segurança da informação",
                            "outro": "Outro"
                        }
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 200
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data"
                    },
                    "horas": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Horas",
                        "maximum": 500,
                        "minimum": 0,
                        "x-unidade": "h",
                        "x-casas": 1
                    },
                    "entidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Entidade formadora",
                        "maxLength": 160
                    },
                    "validade_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válida até",
                        "description": "Em branco, vale pelo período das Definições."
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Certificado"
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 2000
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-clinico": false
            },
            "Recurso_formacoes_Entrada": {
                "type": "object",
                "properties": {
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Pessoa",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "tema": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tema",
                        "enum": [
                            "protecao_dados",
                            "ia",
                            "sigilo",
                            "captura_3d",
                            "seguranca_informacao",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "protecao_dados": "Proteção de dados",
                            "ia": "Inteligência artificial",
                            "sigilo": "Sigilo profissional",
                            "captura_3d": "Captura 3D",
                            "seguranca_informacao": "Segurança da informação",
                            "outro": "Outro"
                        }
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 200
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data"
                    },
                    "horas": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Horas",
                        "maximum": 500,
                        "minimum": 0,
                        "x-unidade": "h",
                        "x-casas": 1
                    },
                    "entidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Entidade formadora",
                        "maxLength": 160
                    },
                    "validade_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válida até",
                        "description": "Em branco, vale pelo período das Definições."
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Certificado"
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 2000
                    }
                },
                "required": [
                    "utilizador_id",
                    "tema",
                    "data"
                ]
            },
            "Recurso_formularios": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "chave": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Chave interna",
                        "description": "Identificador em minúsculas, sem espaços (ex.: anamnese_capilar). Liga as traduções do mesmo formulário.",
                        "maxLength": 60,
                        "pattern": "/^[a-z][a-z0-9_]{1,59}$/"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 400
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "anamnese",
                            "questionario_previo",
                            "seguimento",
                            "satisfacao",
                            "pre_avaliacao",
                            "tecnica",
                            "triagem_sintomas",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "anamnese": "Anamnese",
                            "questionario_previo": "Questionário prévio à consulta",
                            "seguimento": "Seguimento",
                            "satisfacao": "Satisfação",
                            "pre_avaliacao": "Pré-avaliação",
                            "tecnica": "Por técnica",
                            "triagem_sintomas": "Triagem de sintomas",
                            "outro": "Outro"
                        },
                        "default": "outro"
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Técnica",
                        "enum": [
                            "FUE",
                            "FUT",
                            "DHI",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "FUE": "FUE",
                            "FUT": "FUT",
                            "DHI": "DHI",
                            "outra": "Outra"
                        }
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Idioma",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português (Portugal)",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        },
                        "default": "pt-PT"
                    },
                    "expira_dias": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Prazo do pedido (dias)",
                        "description": "Dias de validade da ligação enviada ao paciente. Vazio usa o prazo das Definições.",
                        "maximum": 365,
                        "minimum": 1
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "modelo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Modelo da biblioteca",
                        "description": "Disponível na biblioteca de modelos do construtor."
                    },
                    "versao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Versão",
                        "readOnly": true
                    },
                    "origem_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Formulário de origem",
                        "x-anagen-recurso": "formularios",
                        "readOnly": true
                    },
                    "publicado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Publicado em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-clinico": false
            },
            "Recurso_formularios_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "chave": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Chave interna",
                        "description": "Identificador em minúsculas, sem espaços (ex.: anamnese_capilar). Liga as traduções do mesmo formulário.",
                        "maxLength": 60,
                        "pattern": "/^[a-z][a-z0-9_]{1,59}$/"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 400
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "anamnese",
                            "questionario_previo",
                            "seguimento",
                            "satisfacao",
                            "pre_avaliacao",
                            "tecnica",
                            "triagem_sintomas",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "anamnese": "Anamnese",
                            "questionario_previo": "Questionário prévio à consulta",
                            "seguimento": "Seguimento",
                            "satisfacao": "Satisfação",
                            "pre_avaliacao": "Pré-avaliação",
                            "tecnica": "Por técnica",
                            "triagem_sintomas": "Triagem de sintomas",
                            "outro": "Outro"
                        },
                        "default": "outro"
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Técnica",
                        "enum": [
                            "FUE",
                            "FUT",
                            "DHI",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "FUE": "FUE",
                            "FUT": "FUT",
                            "DHI": "DHI",
                            "outra": "Outra"
                        }
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Idioma",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português (Portugal)",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        },
                        "default": "pt-PT"
                    },
                    "expira_dias": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Prazo do pedido (dias)",
                        "description": "Dias de validade da ligação enviada ao paciente. Vazio usa o prazo das Definições.",
                        "maximum": 365,
                        "minimum": 1
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "modelo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Modelo da biblioteca",
                        "description": "Disponível na biblioteca de modelos do construtor."
                    }
                },
                "required": [
                    "nome",
                    "tipo",
                    "idioma"
                ]
            },
            "Recurso_formularios_respostas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "formulario_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Formulário",
                        "x-anagen-recurso": "formularios",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes",
                        "readOnly": true
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Episódio",
                        "x-anagen-recurso": "episodios",
                        "readOnly": true
                    },
                    "versao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Versão",
                        "readOnly": true
                    },
                    "origem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Origem",
                        "enum": [
                            "paciente",
                            "equipa",
                            "agente",
                            "site"
                        ],
                        "x-enum-rotulos": {
                            "paciente": "Paciente",
                            "equipa": "Equipa",
                            "agente": "Agente virtual",
                            "site": "Site"
                        },
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "pendente",
                            "por_validar",
                            "validado",
                            "rejeitado",
                            "expirado"
                        ],
                        "x-enum-rotulos": {
                            "pendente": "Pendente",
                            "por_validar": "Por validar",
                            "validado": "Validado",
                            "rejeitado": "Rejeitado",
                            "expirado": "Expirado"
                        },
                        "readOnly": true
                    },
                    "pontuacao": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Pontuação",
                        "x-casas": 1,
                        "readOnly": true
                    },
                    "alarme": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Sinal de alarme",
                        "readOnly": true
                    },
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal",
                        "enum": [
                            "email",
                            "sms",
                            "whatsapp",
                            "ligacao",
                            "portal",
                            "presencial"
                        ],
                        "x-enum-rotulos": {
                            "email": "Email",
                            "sms": "SMS",
                            "whatsapp": "WhatsApp",
                            "ligacao": "Só ligação (partilhar manualmente)",
                            "portal": "Portal do paciente",
                            "presencial": "Presencial"
                        },
                        "readOnly": true
                    },
                    "enviado_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Enviado por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "enviado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Enviado em",
                        "readOnly": true
                    },
                    "expira_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Expira em",
                        "readOnly": true
                    },
                    "preenchido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Preenchido em",
                        "readOnly": true
                    },
                    "validado_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Validado por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "validado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Validado em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-clinico": true
            },
            "Recurso_formularios_respostas_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_fotos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Imagem"
                    },
                    "captura_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Captura",
                        "x-anagen-recurso": "capturas"
                    },
                    "marco_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Marco",
                        "x-anagen-recurso": "marcos_acompanhamento"
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Data"
                    },
                    "vista": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Vista",
                        "maxLength": 40
                    },
                    "zona": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Zona",
                        "enum": [
                            "linha_frontal",
                            "tufo_central",
                            "frontal",
                            "tempora_esq",
                            "tempora_dir",
                            "media",
                            "coroa",
                            "occipital",
                            "parietal_esq",
                            "parietal_dir",
                            "barba",
                            "corpo",
                            "sobrancelha",
                            "dadora",
                            "rosto",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "linha_frontal": "Linha frontal",
                            "tufo_central": "Tufo central",
                            "frontal": "Frontal",
                            "tempora_esq": "Têmpora esquerda",
                            "tempora_dir": "Têmpora direita",
                            "media": "Zona média",
                            "coroa": "Coroa",
                            "occipital": "Occipital",
                            "parietal_esq": "Parietal esquerda",
                            "parietal_dir": "Parietal direita",
                            "barba": "Barba",
                            "corpo": "Corpo",
                            "sobrancelha": "Sobrancelha",
                            "dadora": "Zona dadora",
                            "rosto": "Rosto",
                            "outra": "Outra"
                        }
                    },
                    "etiquetas": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Etiquetas",
                        "description": "Lista em JSON, p. ex. [\"linha frontal\", \"controlo\"]."
                    },
                    "album": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Álbum",
                        "maxLength": 80
                    },
                    "origem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Origem",
                        "enum": [
                            "equipa",
                            "portal",
                            "whatsapp",
                            "teleconsulta"
                        ],
                        "x-enum-rotulos": {
                            "equipa": "Equipa",
                            "portal": "Portal",
                            "whatsapp": "WhatsApp",
                            "teleconsulta": "Teleconsulta"
                        },
                        "readOnly": true,
                        "default": "equipa"
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "por_verificar",
                            "aceite",
                            "rejeitada"
                        ],
                        "x-enum-rotulos": {
                            "por_verificar": "Por verificar",
                            "aceite": "Aceite",
                            "rejeitada": "Rejeitada"
                        },
                        "default": "aceite"
                    },
                    "resposta": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resposta ao paciente",
                        "maxLength": 1000,
                        "x-anagen-cifrado": "clinico"
                    },
                    "partilhada_paciente": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Partilhada com o paciente"
                    },
                    "qualidade_ok": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Qualidade suficiente",
                        "readOnly": true
                    },
                    "rosto_desfocado": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Rosto desfocado",
                        "readOnly": true
                    },
                    "original_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Original",
                        "x-anagen-recurso": "fotos",
                        "readOnly": true
                    },
                    "simulacao": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Simulação",
                        "readOnly": true
                    },
                    "plano_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Plano",
                        "x-anagen-recurso": "planos",
                        "readOnly": true
                    },
                    "verificado_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Verificada por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "verificado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Verificada em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "ficha.fotografias",
                "x-anagen-clinico": true
            },
            "Recurso_fotos_Entrada": {
                "type": "object",
                "properties": {
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Imagem"
                    },
                    "captura_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Captura",
                        "x-anagen-recurso": "capturas"
                    },
                    "marco_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Marco",
                        "x-anagen-recurso": "marcos_acompanhamento"
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Data"
                    },
                    "vista": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Vista",
                        "maxLength": 40
                    },
                    "zona": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Zona",
                        "enum": [
                            "linha_frontal",
                            "tufo_central",
                            "frontal",
                            "tempora_esq",
                            "tempora_dir",
                            "media",
                            "coroa",
                            "occipital",
                            "parietal_esq",
                            "parietal_dir",
                            "barba",
                            "corpo",
                            "sobrancelha",
                            "dadora",
                            "rosto",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "linha_frontal": "Linha frontal",
                            "tufo_central": "Tufo central",
                            "frontal": "Frontal",
                            "tempora_esq": "Têmpora esquerda",
                            "tempora_dir": "Têmpora direita",
                            "media": "Zona média",
                            "coroa": "Coroa",
                            "occipital": "Occipital",
                            "parietal_esq": "Parietal esquerda",
                            "parietal_dir": "Parietal direita",
                            "barba": "Barba",
                            "corpo": "Corpo",
                            "sobrancelha": "Sobrancelha",
                            "dadora": "Zona dadora",
                            "rosto": "Rosto",
                            "outra": "Outra"
                        }
                    },
                    "etiquetas": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Etiquetas",
                        "description": "Lista em JSON, p. ex. [\"linha frontal\", \"controlo\"]."
                    },
                    "album": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Álbum",
                        "maxLength": 80
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "por_verificar",
                            "aceite",
                            "rejeitada"
                        ],
                        "x-enum-rotulos": {
                            "por_verificar": "Por verificar",
                            "aceite": "Aceite",
                            "rejeitada": "Rejeitada"
                        },
                        "default": "aceite"
                    },
                    "resposta": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resposta ao paciente",
                        "maxLength": 1000,
                        "x-anagen-cifrado": "clinico"
                    },
                    "partilhada_paciente": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Partilhada com o paciente"
                    }
                },
                "required": [
                    "paciente_id",
                    "ficheiro_id"
                ]
            },
            "Recurso_funil_fases": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 80
                    },
                    "chave": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Chave",
                        "description": "Minúsculas e «_» (ex.: consulta_marcada). Usada em relatórios e integrações.",
                        "maxLength": 40,
                        "pattern": "/^[a-z0-9_]+$/"
                    },
                    "funil_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Funil",
                        "description": "Vazio: funil principal. A chave repete-se em cada funil para os indicadores e as conversões.",
                        "x-anagen-recurso": "funis"
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 999,
                        "minimum": 0
                    },
                    "cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9a-fA-F]{6}$",
                        "title": "Cor"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "aberta",
                            "ganha",
                            "perdida"
                        ],
                        "x-enum-rotulos": {
                            "aberta": "Em curso",
                            "ganha": "Ganha",
                            "perdida": "Perdida"
                        },
                        "default": "aberta"
                    },
                    "sla_horas": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Tempo-alvo na fase",
                        "description": "Para a primeira resposta a um lead que entra nesta fase.",
                        "maximum": 2160,
                        "minimum": 0,
                        "x-unidade": "h"
                    },
                    "tarefas": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Tarefas ao entrar",
                        "description": "Lista de {\"titulo\", \"prazo_horas\", \"prioridade\"}; {nome} é o nome do lead."
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-clinico": false
            },
            "Recurso_funil_fases_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 80
                    },
                    "chave": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Chave",
                        "description": "Minúsculas e «_» (ex.: consulta_marcada). Usada em relatórios e integrações.",
                        "maxLength": 40,
                        "pattern": "/^[a-z0-9_]+$/"
                    },
                    "funil_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Funil",
                        "description": "Vazio: funil principal. A chave repete-se em cada funil para os indicadores e as conversões.",
                        "x-anagen-recurso": "funis"
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 999,
                        "minimum": 0
                    },
                    "cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9a-fA-F]{6}$",
                        "title": "Cor"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "aberta",
                            "ganha",
                            "perdida"
                        ],
                        "x-enum-rotulos": {
                            "aberta": "Em curso",
                            "ganha": "Ganha",
                            "perdida": "Perdida"
                        },
                        "default": "aberta"
                    },
                    "sla_horas": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Tempo-alvo na fase",
                        "description": "Para a primeira resposta a um lead que entra nesta fase.",
                        "maximum": 2160,
                        "minimum": 0,
                        "x-unidade": "h"
                    },
                    "tarefas": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Tarefas ao entrar",
                        "description": "Lista de {\"titulo\", \"prazo_horas\", \"prioridade\"}; {nome} é o nome do lead."
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    }
                },
                "required": [
                    "nome",
                    "chave",
                    "ordem",
                    "tipo"
                ]
            },
            "Recurso_funis": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 255
                    },
                    "paises": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Países",
                        "description": "Códigos de duas letras separados por vírgulas (ex.: BR, AO, MZ).",
                        "maxLength": 400
                    },
                    "idiomas": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "pt-PT",
                                "pt-BR",
                                "en",
                                "es",
                                "fr",
                                "de"
                            ]
                        },
                        "title": "Línguas",
                        "description": "Leads nestas línguas entram neste funil (o português de Portugal fica no principal).",
                        "x-enum-rotulos": {
                            "pt-PT": "Português",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        }
                    },
                    "cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9a-fA-F]{6}$",
                        "title": "Cor"
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "description": "Quando um lead coincide com vários funis, ganha o de menor ordem.",
                        "maximum": 999,
                        "minimum": 0,
                        "default": 10
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-clinico": false
            },
            "Recurso_funis_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 255
                    },
                    "paises": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Países",
                        "description": "Códigos de duas letras separados por vírgulas (ex.: BR, AO, MZ).",
                        "maxLength": 400
                    },
                    "idiomas": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "pt-PT",
                                "pt-BR",
                                "en",
                                "es",
                                "fr",
                                "de"
                            ]
                        },
                        "title": "Línguas",
                        "description": "Leads nestas línguas entram neste funil (o português de Portugal fica no principal).",
                        "x-enum-rotulos": {
                            "pt-PT": "Português",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        }
                    },
                    "cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9a-fA-F]{6}$",
                        "title": "Cor"
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "description": "Quando um lead coincide com vários funis, ganha o de menor ordem.",
                        "maximum": 999,
                        "minimum": 0,
                        "default": 10
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    }
                },
                "required": [
                    "nome"
                ]
            },
            "Recurso_guioes": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "primeiro_contacto",
                            "confirmacao",
                            "proposta_parada",
                            "reativacao",
                            "pos_operatorio",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "primeiro_contacto": "Primeiro contacto",
                            "confirmacao": "Confirmação",
                            "proposta_parada": "Proposta parada",
                            "reativacao": "Reativação",
                            "pos_operatorio": "Pós-operatório",
                            "outro": "Outro"
                        },
                        "default": "primeiro_contacto"
                    },
                    "finalidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Finalidade",
                        "enum": [
                            "servico",
                            "comercial"
                        ],
                        "x-enum-rotulos": {
                            "servico": "Serviço",
                            "comercial": "Comercial"
                        },
                        "default": "servico"
                    },
                    "abertura": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Abertura (identificação e finalidade)",
                        "description": "Lida no início de cada chamada. Use {colaborador} e {clinica}.",
                        "maxLength": 1000
                    },
                    "passos": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Passos",
                        "description": "Lista de {\"titulo\", \"texto\"}."
                    },
                    "campos_obrigatorios": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Campos obrigatórios",
                        "description": "Lista de {\"chave\", \"rotulo\", \"tipo\": texto|escolha|booleano|data, \"opcoes\"}."
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-clinico": false
            },
            "Recurso_guioes_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "primeiro_contacto",
                            "confirmacao",
                            "proposta_parada",
                            "reativacao",
                            "pos_operatorio",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "primeiro_contacto": "Primeiro contacto",
                            "confirmacao": "Confirmação",
                            "proposta_parada": "Proposta parada",
                            "reativacao": "Reativação",
                            "pos_operatorio": "Pós-operatório",
                            "outro": "Outro"
                        },
                        "default": "primeiro_contacto"
                    },
                    "finalidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Finalidade",
                        "enum": [
                            "servico",
                            "comercial"
                        ],
                        "x-enum-rotulos": {
                            "servico": "Serviço",
                            "comercial": "Comercial"
                        },
                        "default": "servico"
                    },
                    "abertura": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Abertura (identificação e finalidade)",
                        "description": "Lida no início de cada chamada. Use {colaborador} e {clinica}.",
                        "maxLength": 1000
                    },
                    "passos": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Passos",
                        "description": "Lista de {\"titulo\", \"texto\"}."
                    },
                    "campos_obrigatorios": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Campos obrigatórios",
                        "description": "Lista de {\"chave\", \"rotulo\", \"tipo\": texto|escolha|booleano|data, \"opcoes\"}."
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    }
                },
                "required": [
                    "nome",
                    "tipo",
                    "finalidade",
                    "abertura"
                ]
            },
            "Recurso_honorarios": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Médico",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "ato": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Ato",
                        "maxLength": 60,
                        "pattern": "^[a-z0-9_]{2,60}$",
                        "default": "manual"
                    },
                    "ato_descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição do ato",
                        "maxLength": 190
                    },
                    "data_ato": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data do ato"
                    },
                    "cirurgia_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Cirurgia"
                    },
                    "consulta_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Consulta",
                        "minimum": 1
                    },
                    "base_calculo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Base de cálculo",
                        "enum": [
                            "fixo",
                            "por_enxerto",
                            "percentagem_ato",
                            "manual"
                        ],
                        "x-enum-rotulos": {
                            "fixo": "Valor fixo por ato",
                            "por_enxerto": "Por enxerto implantado",
                            "percentagem_ato": "Percentagem do valor do ato",
                            "manual": "Registo manual"
                        },
                        "readOnly": true
                    },
                    "quantidade": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Quantidade",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "valor": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Valor",
                        "maximum": 100000,
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "devido",
                            "pago"
                        ],
                        "x-enum-rotulos": {
                            "devido": "Devido",
                            "pago": "Pago"
                        },
                        "readOnly": true,
                        "default": "devido"
                    },
                    "pago_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Pago em",
                        "readOnly": true
                    },
                    "referencia_pagamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Referência do pagamento",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 500
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "financeiro.valores",
                "x-anagen-clinico": false
            },
            "Recurso_honorarios_Entrada": {
                "type": "object",
                "properties": {
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Médico",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "ato": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Ato",
                        "maxLength": 60,
                        "pattern": "^[a-z0-9_]{2,60}$",
                        "default": "manual"
                    },
                    "ato_descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição do ato",
                        "maxLength": 190
                    },
                    "data_ato": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data do ato"
                    },
                    "cirurgia_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Cirurgia"
                    },
                    "consulta_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Consulta",
                        "minimum": 1
                    },
                    "valor": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Valor",
                        "maximum": 100000,
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 500
                    }
                },
                "required": [
                    "utilizador_id",
                    "ato",
                    "data_ato",
                    "valor"
                ]
            },
            "Recurso_horarios": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Profissional",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "recurso_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Sala ou recurso",
                        "description": "Sala habitual nesse horário (ou o horário do próprio recurso).",
                        "x-anagen-recurso": "recursos_agenda"
                    },
                    "dia_semana": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Dia da semana",
                        "enum": [
                            "1",
                            "2",
                            "3",
                            "4",
                            "5",
                            "6",
                            "7"
                        ],
                        "x-enum-rotulos": {
                            "1": "Segunda-feira",
                            "2": "Terça-feira",
                            "3": "Quarta-feira",
                            "4": "Quinta-feira",
                            "5": "Sexta-feira",
                            "6": "Sábado",
                            "7": "Domingo"
                        }
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{2}:\\d{2}$",
                        "title": "Início"
                    },
                    "fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{2}:\\d{2}$",
                        "title": "Fim"
                    },
                    "tipos": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "title": "Tipos permitidos",
                        "description": "Vazio = todos os tipos.",
                        "x-anagen-recurso": "marcacao_tipos"
                    },
                    "valido_de": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válido desde"
                    },
                    "valido_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válido até"
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-clinico": false
            },
            "Recurso_horarios_Entrada": {
                "type": "object",
                "properties": {
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Profissional",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "recurso_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Sala ou recurso",
                        "description": "Sala habitual nesse horário (ou o horário do próprio recurso).",
                        "x-anagen-recurso": "recursos_agenda"
                    },
                    "dia_semana": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Dia da semana",
                        "enum": [
                            "1",
                            "2",
                            "3",
                            "4",
                            "5",
                            "6",
                            "7"
                        ],
                        "x-enum-rotulos": {
                            "1": "Segunda-feira",
                            "2": "Terça-feira",
                            "3": "Quarta-feira",
                            "4": "Quinta-feira",
                            "5": "Sexta-feira",
                            "6": "Sábado",
                            "7": "Domingo"
                        }
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{2}:\\d{2}$",
                        "title": "Início"
                    },
                    "fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{2}:\\d{2}$",
                        "title": "Fim"
                    },
                    "tipos": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "title": "Tipos permitidos",
                        "description": "Vazio = todos os tipos.",
                        "x-anagen-recurso": "marcacao_tipos"
                    },
                    "valido_de": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válido desde"
                    },
                    "valido_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válido até"
                    }
                },
                "required": [
                    "dia_semana",
                    "inicio",
                    "fim"
                ]
            },
            "Recurso_ia_pedidos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "tarefa": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Uso",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "fornecedor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Serviço",
                        "enum": [
                            "ollama",
                            "openrouter"
                        ],
                        "x-enum-rotulos": {
                            "ollama": "Serviço local de IA",
                            "openrouter": "Serviço externo de IA"
                        },
                        "readOnly": true
                    },
                    "modelo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Modelo",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "ok",
                            "recurso",
                            "erro"
                        ],
                        "x-enum-rotulos": {
                            "ok": "Respondido",
                            "recurso": "Respondido pela alternativa",
                            "erro": "Falhou"
                        },
                        "readOnly": true
                    },
                    "duracao_ms": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Duração",
                        "x-unidade": "ms",
                        "readOnly": true
                    },
                    "tokens_entrada": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Unidades de entrada",
                        "readOnly": true
                    },
                    "tokens_saida": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Unidades de saída",
                        "readOnly": true
                    },
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Pedido por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "erro": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Erro",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "entrada_hash": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Impressão digital da entrada",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-clinico": false
            },
            "Recurso_ia_pedidos_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_ia_propostas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes",
                        "readOnly": true
                    },
                    "consulta_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Consulta",
                        "x-anagen-recurso": "consultas",
                        "readOnly": true
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "escriba",
                            "pre_analise",
                            "resumo",
                            "rascunho_resposta",
                            "triagem"
                        ],
                        "x-enum-rotulos": {
                            "escriba": "Escriba clínico",
                            "pre_analise": "Pré-análise das fotografias",
                            "resumo": "Resumo antes da consulta",
                            "rascunho_resposta": "Rascunho de resposta",
                            "triagem": "Triagem de sintomas"
                        },
                        "readOnly": true
                    },
                    "campo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Campo",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "valor_proposto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Valor proposto",
                        "x-anagen-cifrado": "clinico",
                        "readOnly": true
                    },
                    "excerto_origem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Excerto de origem",
                        "x-anagen-cifrado": "clinico",
                        "readOnly": true
                    },
                    "fatores": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Fatores",
                        "readOnly": true
                    },
                    "fornecedor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Serviço",
                        "enum": [
                            "ollama",
                            "openrouter"
                        ],
                        "x-enum-rotulos": {
                            "ollama": "Serviço privado da clínica",
                            "openrouter": "Serviço externo (alternativo)"
                        },
                        "readOnly": true
                    },
                    "modelo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Modelo",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "parametros": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Parâmetros",
                        "readOnly": true
                    },
                    "confianca": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Confiança",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "pendente",
                            "aceite",
                            "corrigida",
                            "recusada"
                        ],
                        "x-enum-rotulos": {
                            "pendente": "Pendente",
                            "aceite": "Aceite",
                            "corrigida": "Corrigida",
                            "recusada": "Recusada"
                        },
                        "readOnly": true
                    },
                    "valor_final": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Valor final",
                        "x-anagen-cifrado": "clinico",
                        "readOnly": true
                    },
                    "decidido_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Decidido por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "decidido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Decidido em",
                        "readOnly": true
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "ia_pedido_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Pedido de origem",
                        "x-anagen-recurso": "ia_pedidos",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-clinico": true
            },
            "Recurso_ia_propostas_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_imagens_marketing": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 160
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "resultado",
                            "antes_depois",
                            "testemunho",
                            "institucional"
                        ],
                        "x-enum-rotulos": {
                            "resultado": "Resultado",
                            "antes_depois": "Antes e depois",
                            "testemunho": "Testemunho",
                            "institucional": "Institucional"
                        },
                        "default": "resultado"
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Imagem"
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "description": "Vazio para imagens institucionais sem pessoas identificáveis.",
                        "x-anagen-recurso": "pacientes"
                    },
                    "consentimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "N.º do consentimento",
                        "description": "Consentimento «imagens para comunicação» do paciente (ficha → Consentimentos).",
                        "minimum": 1
                    },
                    "procedimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Procedimento",
                        "x-anagen-recurso": "procedimentos"
                    },
                    "canais": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "email",
                                "site",
                                "redes",
                                "impressos",
                                "whatsapp"
                            ]
                        },
                        "title": "Canais autorizados",
                        "x-enum-rotulos": {
                            "email": "Email",
                            "site": "Site",
                            "redes": "Redes sociais",
                            "impressos": "Impressos",
                            "whatsapp": "WhatsApp"
                        }
                    },
                    "valido_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Pode ser usada até"
                    },
                    "retocada": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Imagem retocada",
                        "description": "Imagens retocadas não são aceites."
                    },
                    "simulacao": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Simulação ou imagem gerada",
                        "description": "Simulações ficam bloqueadas para comunicação."
                    },
                    "identificavel_ers": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Pessoa identificável pela ERS",
                        "description": "O testemunho tem de corresponder a um utente identificável, se a ERS pedir."
                    },
                    "testemunho": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Testemunho",
                        "maxLength": 2000
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "ativa",
                            "retirada"
                        ],
                        "x-enum-rotulos": {
                            "ativa": "Ativa",
                            "retirada": "Retirada"
                        },
                        "readOnly": true
                    },
                    "motivo_retirada": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo da retirada",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-clinico": false
            },
            "Recurso_imagens_marketing_Entrada": {
                "type": "object",
                "properties": {
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 160
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "resultado",
                            "antes_depois",
                            "testemunho",
                            "institucional"
                        ],
                        "x-enum-rotulos": {
                            "resultado": "Resultado",
                            "antes_depois": "Antes e depois",
                            "testemunho": "Testemunho",
                            "institucional": "Institucional"
                        },
                        "default": "resultado"
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Imagem"
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "description": "Vazio para imagens institucionais sem pessoas identificáveis.",
                        "x-anagen-recurso": "pacientes"
                    },
                    "consentimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "N.º do consentimento",
                        "description": "Consentimento «imagens para comunicação» do paciente (ficha → Consentimentos).",
                        "minimum": 1
                    },
                    "procedimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Procedimento",
                        "x-anagen-recurso": "procedimentos"
                    },
                    "canais": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "email",
                                "site",
                                "redes",
                                "impressos",
                                "whatsapp"
                            ]
                        },
                        "title": "Canais autorizados",
                        "x-enum-rotulos": {
                            "email": "Email",
                            "site": "Site",
                            "redes": "Redes sociais",
                            "impressos": "Impressos",
                            "whatsapp": "WhatsApp"
                        }
                    },
                    "valido_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Pode ser usada até"
                    },
                    "retocada": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Imagem retocada",
                        "description": "Imagens retocadas não são aceites."
                    },
                    "simulacao": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Simulação ou imagem gerada",
                        "description": "Simulações ficam bloqueadas para comunicação."
                    },
                    "identificavel_ers": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Pessoa identificável pela ERS",
                        "description": "O testemunho tem de corresponder a um utente identificável, se a ERS pedir."
                    },
                    "testemunho": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Testemunho",
                        "maxLength": 2000
                    }
                },
                "required": [
                    "titulo",
                    "tipo",
                    "ficheiro_id",
                    "canais",
                    "valido_ate"
                ]
            },
            "Recurso_importacoes": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "pacientes",
                            "consultas",
                            "alertas",
                            "episodios"
                        ],
                        "x-enum-rotulos": {
                            "pacientes": "Pacientes",
                            "consultas": "Consultas",
                            "alertas": "Alertas clínicos",
                            "episodios": "Episódios"
                        },
                        "readOnly": true
                    },
                    "ficheiro": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Ficheiro",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "total": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Linhas",
                        "readOnly": true
                    },
                    "importados": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Importados",
                        "readOnly": true
                    },
                    "duplicados": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Duplicados",
                        "readOnly": true
                    },
                    "erros": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Erros",
                        "readOnly": true
                    },
                    "relatorio": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Relatório por linha",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-clinico": false
            },
            "Recurso_importacoes_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_incidentes_seguranca": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 200
                    },
                    "gravidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Gravidade",
                        "enum": [
                            "baixa",
                            "media",
                            "alta",
                            "critica"
                        ],
                        "x-enum-rotulos": {
                            "baixa": "Baixa",
                            "media": "Média",
                            "alta": "Alta",
                            "critica": "Crítica"
                        },
                        "default": "media"
                    },
                    "risco": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Risco para os titulares",
                        "description": "«Risco» obriga a notificar a CNPD; «risco elevado» obriga também a informar os titulares (RGPD, art. 33.º e 34.º).",
                        "enum": [
                            "por_avaliar",
                            "improvavel",
                            "risco",
                            "risco_elevado"
                        ],
                        "x-enum-rotulos": {
                            "por_avaliar": "Por avaliar",
                            "improvavel": "Risco improvável",
                            "risco": "Risco",
                            "risco_elevado": "Risco elevado"
                        },
                        "default": "por_avaliar"
                    },
                    "detetado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Detetado em"
                    },
                    "ocorrido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Ocorrido em"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "O que aconteceu",
                        "maxLength": 20000,
                        "x-anagen-cifrado": "geral"
                    },
                    "dados_afetados": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "identificacao",
                                "contacto",
                                "saude",
                                "imagens",
                                "financeiros",
                                "credenciais",
                                "gravacoes",
                                "outros"
                            ]
                        },
                        "title": "Dados afetados",
                        "x-enum-rotulos": {
                            "identificacao": "Identificação",
                            "contacto": "Contactos",
                            "saude": "Saúde",
                            "imagens": "Imagens",
                            "financeiros": "Financeiros",
                            "credenciais": "Credenciais",
                            "gravacoes": "Gravações",
                            "outros": "Outros"
                        }
                    },
                    "titulares_n": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Titulares afetados",
                        "minimum": 0
                    },
                    "notificar_cnpd": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Notificar a CNPD",
                        "description": "Obrigatório salvo se for improvável que resulte risco para os titulares.",
                        "default": 1
                    },
                    "prazo_cnpd": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Prazo para a CNPD",
                        "readOnly": true
                    },
                    "notificado_cnpd_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Notificado à CNPD em",
                        "readOnly": true
                    },
                    "cnpd_referencia": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Referência da CNPD",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "notificar_titulares": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Informar os titulares",
                        "description": "Obrigatório quando o risco é elevado."
                    },
                    "notificados_titulares_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Titulares informados em",
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "aberto",
                            "em_analise",
                            "contido",
                            "notificado",
                            "encerrado"
                        ],
                        "x-enum-rotulos": {
                            "aberto": "Aberto",
                            "em_analise": "Em análise",
                            "contido": "Contido",
                            "notificado": "Notificado",
                            "encerrado": "Encerrado"
                        },
                        "default": "aberto"
                    },
                    "medidas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Medidas tomadas",
                        "maxLength": 20000,
                        "x-anagen-cifrado": "geral"
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Responsável",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "encerrado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Encerrado em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-clinico": false
            },
            "Recurso_incidentes_seguranca_Entrada": {
                "type": "object",
                "properties": {
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 200
                    },
                    "gravidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Gravidade",
                        "enum": [
                            "baixa",
                            "media",
                            "alta",
                            "critica"
                        ],
                        "x-enum-rotulos": {
                            "baixa": "Baixa",
                            "media": "Média",
                            "alta": "Alta",
                            "critica": "Crítica"
                        },
                        "default": "media"
                    },
                    "risco": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Risco para os titulares",
                        "description": "«Risco» obriga a notificar a CNPD; «risco elevado» obriga também a informar os titulares (RGPD, art. 33.º e 34.º).",
                        "enum": [
                            "por_avaliar",
                            "improvavel",
                            "risco",
                            "risco_elevado"
                        ],
                        "x-enum-rotulos": {
                            "por_avaliar": "Por avaliar",
                            "improvavel": "Risco improvável",
                            "risco": "Risco",
                            "risco_elevado": "Risco elevado"
                        },
                        "default": "por_avaliar"
                    },
                    "detetado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Detetado em"
                    },
                    "ocorrido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Ocorrido em"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "O que aconteceu",
                        "maxLength": 20000,
                        "x-anagen-cifrado": "geral"
                    },
                    "dados_afetados": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "identificacao",
                                "contacto",
                                "saude",
                                "imagens",
                                "financeiros",
                                "credenciais",
                                "gravacoes",
                                "outros"
                            ]
                        },
                        "title": "Dados afetados",
                        "x-enum-rotulos": {
                            "identificacao": "Identificação",
                            "contacto": "Contactos",
                            "saude": "Saúde",
                            "imagens": "Imagens",
                            "financeiros": "Financeiros",
                            "credenciais": "Credenciais",
                            "gravacoes": "Gravações",
                            "outros": "Outros"
                        }
                    },
                    "titulares_n": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Titulares afetados",
                        "minimum": 0
                    },
                    "notificar_cnpd": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Notificar a CNPD",
                        "description": "Obrigatório salvo se for improvável que resulte risco para os titulares.",
                        "default": 1
                    },
                    "notificar_titulares": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Informar os titulares",
                        "description": "Obrigatório quando o risco é elevado."
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "aberto",
                            "em_analise",
                            "contido",
                            "notificado",
                            "encerrado"
                        ],
                        "x-enum-rotulos": {
                            "aberto": "Aberto",
                            "em_analise": "Em análise",
                            "contido": "Contido",
                            "notificado": "Notificado",
                            "encerrado": "Encerrado"
                        },
                        "default": "aberto"
                    },
                    "medidas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Medidas tomadas",
                        "maxLength": 20000,
                        "x-anagen-cifrado": "geral"
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Responsável",
                        "x-anagen-recurso": "utilizadores"
                    }
                },
                "required": [
                    "titulo",
                    "gravidade",
                    "descricao"
                ]
            },
            "Recurso_itinerarios": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Episódio",
                        "x-anagen-recurso": "episodios"
                    },
                    "chegada": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Chegada"
                    },
                    "voo_chegada": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Voo de chegada",
                        "maxLength": 60
                    },
                    "partida": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Partida"
                    },
                    "voo_partida": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Voo de partida",
                        "maxLength": 60
                    },
                    "hotel": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Hotel",
                        "maxLength": 190
                    },
                    "transporte": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Transporte",
                        "maxLength": 255
                    },
                    "contacto_local": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Contacto local"
                    },
                    "interprete_idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Idioma do intérprete",
                        "enum": [
                            "pt-PT",
                            "en",
                            "es",
                            "fr",
                            "de",
                            "it",
                            "ar",
                            "ru",
                            "zh",
                            "nl"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão",
                            "it": "Italiano",
                            "ar": "Árabe",
                            "ru": "Russo",
                            "zh": "Chinês",
                            "nl": "Neerlandês"
                        }
                    },
                    "interprete_recurso_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Intérprete",
                        "description": "Intérprete da agenda (recurso por idioma), reservado nas marcações.",
                        "x-anagen-recurso": "recursos_agenda"
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 4000
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-clinico": false
            },
            "Recurso_itinerarios_Entrada": {
                "type": "object",
                "properties": {
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Episódio",
                        "x-anagen-recurso": "episodios"
                    },
                    "chegada": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Chegada"
                    },
                    "voo_chegada": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Voo de chegada",
                        "maxLength": 60
                    },
                    "partida": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Partida"
                    },
                    "voo_partida": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Voo de partida",
                        "maxLength": 60
                    },
                    "hotel": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Hotel",
                        "maxLength": 190
                    },
                    "transporte": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Transporte",
                        "maxLength": 255
                    },
                    "contacto_local": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Contacto local"
                    },
                    "interprete_idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Idioma do intérprete",
                        "enum": [
                            "pt-PT",
                            "en",
                            "es",
                            "fr",
                            "de",
                            "it",
                            "ar",
                            "ru",
                            "zh",
                            "nl"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão",
                            "it": "Italiano",
                            "ar": "Árabe",
                            "ru": "Russo",
                            "zh": "Chinês",
                            "nl": "Neerlandês"
                        }
                    },
                    "interprete_recurso_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Intérprete",
                        "description": "Intérprete da agenda (recurso por idioma), reservado nas marcações.",
                        "x-anagen-recurso": "recursos_agenda"
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 4000
                    }
                },
                "required": [
                    "paciente_id"
                ]
            },
            "Recurso_leads": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "email": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "email",
                        "title": "Email"
                    },
                    "telefone": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Telefone",
                        "description": "Com indicativo do país; os números portugueses sem indicativo ficam com +351."
                    },
                    "data_nascimento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data de nascimento"
                    },
                    "nif": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{9}$",
                        "title": "NIF",
                        "description": "Guardado apenas como código de pesquisa (deteção de duplicados); não fica legível."
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        },
                        "default": "pt-PT"
                    },
                    "pais": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "País",
                        "description": "Código de 2 letras (PT, ES, FR…).",
                        "maxLength": 2,
                        "pattern": "/^[A-Za-z]{2}$/"
                    },
                    "procedimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Procedimento de interesse",
                        "x-anagen-recurso": "procedimentos"
                    },
                    "origem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Origem",
                        "enum": [
                            "site",
                            "pre_avaliacao",
                            "meta",
                            "google",
                            "whatsapp",
                            "instagram",
                            "messenger",
                            "telefone",
                            "presencial",
                            "recomendacao",
                            "agente_voz",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "site": "Site",
                            "pre_avaliacao": "Pré-avaliação",
                            "meta": "Meta (anúncios)",
                            "google": "Google (anúncios)",
                            "whatsapp": "WhatsApp",
                            "instagram": "Instagram",
                            "messenger": "Messenger",
                            "telefone": "Telefone",
                            "presencial": "Presencial",
                            "recomendacao": "Recomendação",
                            "agente_voz": "Agente de voz",
                            "outro": "Outro"
                        },
                        "default": "presencial"
                    },
                    "campanha": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Campanha",
                        "maxLength": 120
                    },
                    "anuncio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Anúncio",
                        "maxLength": 120
                    },
                    "utm_source": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "utm_source",
                        "maxLength": 120
                    },
                    "utm_medium": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "utm_medium",
                        "maxLength": 120
                    },
                    "utm_campaign": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "utm_campaign",
                        "maxLength": 120
                    },
                    "utm_term": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "utm_term",
                        "maxLength": 120
                    },
                    "utm_content": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "utm_content",
                        "maxLength": 120
                    },
                    "clique_id": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Identificador do clique",
                        "description": "Identificador do clique no anúncio (para devolver conversões, só com base legal).",
                        "maxLength": 255
                    },
                    "clique_tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo do identificador de clique",
                        "enum": [
                            "gclid",
                            "gbraid",
                            "wbraid",
                            "fbclid",
                            "ttclid",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "gclid": "Google (clique)",
                            "gbraid": "Google (aplicação)",
                            "wbraid": "Google (web)",
                            "fbclid": "Meta (clique)",
                            "ttclid": "TikTok (clique)",
                            "outro": "Outro"
                        }
                    },
                    "lead_externo_id": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Lead na plataforma de anúncios",
                        "description": "Identificador do formulário de anúncio que criou este lead.",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "funil_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Funil",
                        "description": "Vazio: funil principal. Escolhido pelo país e pela língua quando o lead entra.",
                        "x-anagen-recurso": "funis",
                        "readOnly": true
                    },
                    "fase_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Fase",
                        "x-anagen-recurso": "funil_fases"
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Responsável",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "pontuacao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Pontuação",
                        "maximum": 100,
                        "minimum": 0,
                        "readOnly": true
                    },
                    "decisao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Decisão",
                        "enum": [
                            "por_decidir",
                            "confirmado",
                            "indeciso",
                            "recusado"
                        ],
                        "x-enum-rotulos": {
                            "por_decidir": "Por decidir",
                            "confirmado": "Confirmado",
                            "indeciso": "Indeciso",
                            "recusado": "Recusado"
                        },
                        "default": "por_decidir"
                    },
                    "motivo_indecisao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo da indecisão ou recusa",
                        "maxLength": 255
                    },
                    "valor_estimado": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Valor estimado",
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2,
                        "x-anagen-permissao": "financeiro.valores"
                    },
                    "motivo_perda": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo de perda",
                        "enum": [
                            "preco",
                            "prazo",
                            "concorrencia",
                            "nao_elegivel",
                            "sem_resposta",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "preco": "Preço",
                            "prazo": "Prazo",
                            "concorrencia": "Concorrência",
                            "nao_elegivel": "Não elegível",
                            "sem_resposta": "Sem resposta",
                            "outro": "Outro"
                        }
                    },
                    "motivo_perda_detalhe": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Pormenor do motivo",
                        "maxLength": 255
                    },
                    "recomendado_por_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Recomendado por",
                        "x-anagen-recurso": "pacientes"
                    },
                    "recompensa_estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Recompensa",
                        "enum": [
                            "pendente",
                            "atribuida"
                        ],
                        "x-enum-rotulos": {
                            "pendente": "Pendente",
                            "atribuida": "Atribuída"
                        }
                    },
                    "consentimento_contacto": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Aceitou ser contactado sobre o pedido",
                        "description": "Contacto sobre o próprio pedido. As comunicações comerciais exigem consentimento de marketing à parte."
                    },
                    "proxima_acao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Próxima ação",
                        "maxLength": 190
                    },
                    "proxima_acao_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Data da próxima ação"
                    },
                    "sla_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Responder até",
                        "readOnly": true
                    },
                    "primeira_resposta_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Primeira resposta",
                        "readOnly": true
                    },
                    "ultimo_contacto_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Último contacto",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes",
                        "readOnly": true
                    },
                    "duplicado_de": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Possível duplicado de",
                        "x-anagen-recurso": "leads",
                        "readOnly": true
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 5000,
                        "x-anagen-cifrado": "geral"
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-clinico": false
            },
            "Recurso_leads_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "email": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "email",
                        "title": "Email"
                    },
                    "telefone": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Telefone",
                        "description": "Com indicativo do país; os números portugueses sem indicativo ficam com +351."
                    },
                    "data_nascimento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data de nascimento"
                    },
                    "nif": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{9}$",
                        "title": "NIF",
                        "description": "Guardado apenas como código de pesquisa (deteção de duplicados); não fica legível."
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        },
                        "default": "pt-PT"
                    },
                    "pais": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "País",
                        "description": "Código de 2 letras (PT, ES, FR…).",
                        "maxLength": 2,
                        "pattern": "/^[A-Za-z]{2}$/"
                    },
                    "procedimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Procedimento de interesse",
                        "x-anagen-recurso": "procedimentos"
                    },
                    "origem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Origem",
                        "enum": [
                            "site",
                            "pre_avaliacao",
                            "meta",
                            "google",
                            "whatsapp",
                            "instagram",
                            "messenger",
                            "telefone",
                            "presencial",
                            "recomendacao",
                            "agente_voz",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "site": "Site",
                            "pre_avaliacao": "Pré-avaliação",
                            "meta": "Meta (anúncios)",
                            "google": "Google (anúncios)",
                            "whatsapp": "WhatsApp",
                            "instagram": "Instagram",
                            "messenger": "Messenger",
                            "telefone": "Telefone",
                            "presencial": "Presencial",
                            "recomendacao": "Recomendação",
                            "agente_voz": "Agente de voz",
                            "outro": "Outro"
                        },
                        "default": "presencial"
                    },
                    "campanha": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Campanha",
                        "maxLength": 120
                    },
                    "anuncio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Anúncio",
                        "maxLength": 120
                    },
                    "utm_source": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "utm_source",
                        "maxLength": 120
                    },
                    "utm_medium": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "utm_medium",
                        "maxLength": 120
                    },
                    "utm_campaign": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "utm_campaign",
                        "maxLength": 120
                    },
                    "utm_term": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "utm_term",
                        "maxLength": 120
                    },
                    "utm_content": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "utm_content",
                        "maxLength": 120
                    },
                    "clique_id": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Identificador do clique",
                        "description": "Identificador do clique no anúncio (para devolver conversões, só com base legal).",
                        "maxLength": 255
                    },
                    "clique_tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo do identificador de clique",
                        "enum": [
                            "gclid",
                            "gbraid",
                            "wbraid",
                            "fbclid",
                            "ttclid",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "gclid": "Google (clique)",
                            "gbraid": "Google (aplicação)",
                            "wbraid": "Google (web)",
                            "fbclid": "Meta (clique)",
                            "ttclid": "TikTok (clique)",
                            "outro": "Outro"
                        }
                    },
                    "fase_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Fase",
                        "x-anagen-recurso": "funil_fases"
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Responsável",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "decisao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Decisão",
                        "enum": [
                            "por_decidir",
                            "confirmado",
                            "indeciso",
                            "recusado"
                        ],
                        "x-enum-rotulos": {
                            "por_decidir": "Por decidir",
                            "confirmado": "Confirmado",
                            "indeciso": "Indeciso",
                            "recusado": "Recusado"
                        },
                        "default": "por_decidir"
                    },
                    "motivo_indecisao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo da indecisão ou recusa",
                        "maxLength": 255
                    },
                    "valor_estimado": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Valor estimado",
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2,
                        "x-anagen-permissao": "financeiro.valores"
                    },
                    "motivo_perda": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo de perda",
                        "enum": [
                            "preco",
                            "prazo",
                            "concorrencia",
                            "nao_elegivel",
                            "sem_resposta",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "preco": "Preço",
                            "prazo": "Prazo",
                            "concorrencia": "Concorrência",
                            "nao_elegivel": "Não elegível",
                            "sem_resposta": "Sem resposta",
                            "outro": "Outro"
                        }
                    },
                    "motivo_perda_detalhe": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Pormenor do motivo",
                        "maxLength": 255
                    },
                    "recomendado_por_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Recomendado por",
                        "x-anagen-recurso": "pacientes"
                    },
                    "recompensa_estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Recompensa",
                        "enum": [
                            "pendente",
                            "atribuida"
                        ],
                        "x-enum-rotulos": {
                            "pendente": "Pendente",
                            "atribuida": "Atribuída"
                        }
                    },
                    "consentimento_contacto": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Aceitou ser contactado sobre o pedido",
                        "description": "Contacto sobre o próprio pedido. As comunicações comerciais exigem consentimento de marketing à parte."
                    },
                    "proxima_acao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Próxima ação",
                        "maxLength": 190
                    },
                    "proxima_acao_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Data da próxima ação"
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 5000,
                        "x-anagen-cifrado": "geral"
                    }
                },
                "required": [
                    "nome",
                    "origem"
                ]
            },
            "Recurso_lista_espera": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Lead",
                        "x-anagen-recurso": "leads"
                    },
                    "tipo_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Tipo de marcação",
                        "x-anagen-recurso": "marcacao_tipos"
                    },
                    "profissional_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Profissional preferido",
                        "description": "Vazio = qualquer profissional.",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "preferencias": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Preferências",
                        "description": "Ex.: manhãs, terças e quintas.",
                        "maxLength": 255
                    },
                    "prioridade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Prioridade",
                        "enum": [
                            "baixa",
                            "normal",
                            "alta"
                        ],
                        "x-enum-rotulos": {
                            "baixa": "Baixa",
                            "normal": "Normal",
                            "alta": "Alta"
                        },
                        "default": "normal"
                    },
                    "desde": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Na lista desde"
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "ativa",
                            "contactado",
                            "marcado",
                            "cancelado"
                        ],
                        "x-enum-rotulos": {
                            "ativa": "À espera",
                            "contactado": "Vaga oferecida",
                            "marcado": "Marcado",
                            "cancelado": "Saiu da lista"
                        },
                        "default": "ativa"
                    },
                    "oferta_inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Vaga oferecida",
                        "readOnly": true
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 2000
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-clinico": false
            },
            "Recurso_lista_espera_Entrada": {
                "type": "object",
                "properties": {
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Lead",
                        "x-anagen-recurso": "leads"
                    },
                    "tipo_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Tipo de marcação",
                        "x-anagen-recurso": "marcacao_tipos"
                    },
                    "profissional_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Profissional preferido",
                        "description": "Vazio = qualquer profissional.",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "preferencias": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Preferências",
                        "description": "Ex.: manhãs, terças e quintas.",
                        "maxLength": 255
                    },
                    "prioridade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Prioridade",
                        "enum": [
                            "baixa",
                            "normal",
                            "alta"
                        ],
                        "x-enum-rotulos": {
                            "baixa": "Baixa",
                            "normal": "Normal",
                            "alta": "Alta"
                        },
                        "default": "normal"
                    },
                    "desde": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Na lista desde"
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "ativa",
                            "contactado",
                            "marcado",
                            "cancelado"
                        ],
                        "x-enum-rotulos": {
                            "ativa": "À espera",
                            "contactado": "Vaga oferecida",
                            "marcado": "Marcado",
                            "cancelado": "Saiu da lista"
                        },
                        "default": "ativa"
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 2000
                    }
                },
                "required": [
                    "tipo_id"
                ]
            },
            "Recurso_locais": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome do local",
                        "maxLength": 160
                    },
                    "morada": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Morada",
                        "maxLength": 255
                    },
                    "codigo_postal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{4}-\\d{3}$",
                        "title": "Código postal"
                    },
                    "localidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Localidade",
                        "maxLength": 100
                    },
                    "telefone": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Telefone"
                    },
                    "email": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "email",
                        "title": "Email",
                        "maxLength": 190
                    },
                    "principal": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Local principal",
                        "description": "Só há um local principal; marcar este desmarca o anterior.",
                        "default": 0
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "description": "Os locais ativos contam para o limite da licença.",
                        "default": 1
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-clinico": false
            },
            "Recurso_locais_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome do local",
                        "maxLength": 160
                    },
                    "morada": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Morada",
                        "maxLength": 255
                    },
                    "codigo_postal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{4}-\\d{3}$",
                        "title": "Código postal"
                    },
                    "localidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Localidade",
                        "maxLength": 100
                    },
                    "telefone": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Telefone"
                    },
                    "email": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "email",
                        "title": "Email",
                        "maxLength": 190
                    },
                    "principal": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Local principal",
                        "description": "Só há um local principal; marcar este desmarca o anterior.",
                        "default": 0
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "description": "Os locais ativos contam para o limite da licença.",
                        "default": 1
                    }
                },
                "required": [
                    "nome"
                ]
            },
            "Recurso_marcacao_tipos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "chave": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Chave",
                        "description": "Identificador fixo em minúsculas (ex.: primeira_consulta).",
                        "maxLength": 40,
                        "pattern": "/^[a-z0-9_]{2,40}$/"
                    },
                    "duracao_min": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Duração (min)",
                        "maximum": 960,
                        "minimum": 5,
                        "default": 30
                    },
                    "cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9a-fA-F]{6}$",
                        "title": "Cor"
                    },
                    "teleconsulta": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Por vídeo (teleconsulta)"
                    },
                    "cirurgia": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Bloco cirúrgico",
                        "description": "Tipo usado pelo mapa de cirurgias."
                    },
                    "margem_antes_min": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Margem antes (min)",
                        "maximum": 240,
                        "minimum": 0,
                        "default": 0
                    },
                    "margem_depois_min": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Margem depois (min)",
                        "maximum": 240,
                        "minimum": 0,
                        "default": 0
                    },
                    "sala_obrigatoria": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Exige sala"
                    },
                    "exige_sinal": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Exige sinal"
                    },
                    "valor_sinal": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Valor do sinal",
                        "maximum": 100000,
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "falta_perde_sinal": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Falta ou cancelamento tardio perde o sinal"
                    },
                    "antecedencia_min_h": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Antecedência mínima para marcar online (h)",
                        "description": "Aplica-se às marcações feitas pelo paciente (portal, site, agente).",
                        "maximum": 720,
                        "minimum": 0,
                        "default": 24
                    },
                    "cancelamento_min_h": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Cancelamento sem custos até (horas antes)",
                        "maximum": 720,
                        "minimum": 0,
                        "default": 24
                    },
                    "politica_cancelamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Política de cancelamento e faltas",
                        "description": "Mostrada ao paciente na ligação da marcação.",
                        "maxLength": 2000
                    },
                    "procedimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Procedimento",
                        "x-anagen-recurso": "procedimentos"
                    },
                    "online": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Marcação online",
                        "description": "Disponível no portal, no site e no agente de voz."
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 999,
                        "minimum": 0,
                        "default": 0
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-clinico": false
            },
            "Recurso_marcacao_tipos_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "chave": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Chave",
                        "description": "Identificador fixo em minúsculas (ex.: primeira_consulta).",
                        "maxLength": 40,
                        "pattern": "/^[a-z0-9_]{2,40}$/"
                    },
                    "duracao_min": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Duração (min)",
                        "maximum": 960,
                        "minimum": 5,
                        "default": 30
                    },
                    "cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9a-fA-F]{6}$",
                        "title": "Cor"
                    },
                    "teleconsulta": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Por vídeo (teleconsulta)"
                    },
                    "cirurgia": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Bloco cirúrgico",
                        "description": "Tipo usado pelo mapa de cirurgias."
                    },
                    "margem_antes_min": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Margem antes (min)",
                        "maximum": 240,
                        "minimum": 0,
                        "default": 0
                    },
                    "margem_depois_min": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Margem depois (min)",
                        "maximum": 240,
                        "minimum": 0,
                        "default": 0
                    },
                    "sala_obrigatoria": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Exige sala"
                    },
                    "exige_sinal": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Exige sinal"
                    },
                    "valor_sinal": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Valor do sinal",
                        "maximum": 100000,
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "falta_perde_sinal": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Falta ou cancelamento tardio perde o sinal"
                    },
                    "antecedencia_min_h": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Antecedência mínima para marcar online (h)",
                        "description": "Aplica-se às marcações feitas pelo paciente (portal, site, agente).",
                        "maximum": 720,
                        "minimum": 0,
                        "default": 24
                    },
                    "cancelamento_min_h": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Cancelamento sem custos até (horas antes)",
                        "maximum": 720,
                        "minimum": 0,
                        "default": 24
                    },
                    "politica_cancelamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Política de cancelamento e faltas",
                        "description": "Mostrada ao paciente na ligação da marcação.",
                        "maxLength": 2000
                    },
                    "procedimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Procedimento",
                        "x-anagen-recurso": "procedimentos"
                    },
                    "online": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Marcação online",
                        "description": "Disponível no portal, no site e no agente de voz."
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 999,
                        "minimum": 0,
                        "default": 0
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    }
                },
                "required": [
                    "nome",
                    "chave",
                    "duracao_min"
                ]
            },
            "Recurso_marcacoes": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Início",
                        "readOnly": true
                    },
                    "fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Fim",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes",
                        "readOnly": true
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Lead",
                        "x-anagen-recurso": "leads",
                        "readOnly": true
                    },
                    "tipo_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Tipo",
                        "x-anagen-recurso": "marcacao_tipos",
                        "readOnly": true
                    },
                    "profissional_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Profissional",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "sala_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Sala",
                        "x-anagen-recurso": "recursos_agenda",
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "pedido",
                            "marcada",
                            "confirmada",
                            "em_curso",
                            "concluida",
                            "faltou",
                            "cancelada",
                            "remarcada"
                        ],
                        "x-enum-rotulos": {
                            "pedido": "Pedido",
                            "marcada": "Por confirmar",
                            "confirmada": "Confirmada",
                            "em_curso": "Em curso",
                            "concluida": "Concluída",
                            "faltou": "Faltou",
                            "cancelada": "Cancelada",
                            "remarcada": "Remarcada"
                        },
                        "readOnly": true
                    },
                    "origem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Origem",
                        "enum": [
                            "equipa",
                            "portal",
                            "site",
                            "agente",
                            "telefone"
                        ],
                        "x-enum-rotulos": {
                            "equipa": "Equipa",
                            "portal": "Portal",
                            "site": "Site",
                            "agente": "Agente de voz",
                            "telefone": "Telefone"
                        },
                        "readOnly": true
                    },
                    "confirmada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Confirmada em",
                        "readOnly": true
                    },
                    "lembrete_enviado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Lembrete enviado em",
                        "readOnly": true
                    },
                    "checkin_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Chegada",
                        "readOnly": true
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "readOnly": true
                    },
                    "motivo_cancelamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo do cancelamento",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-clinico": false
            },
            "Recurso_marcacoes_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_marcos_acompanhamento": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "marco": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Marco",
                        "enum": [
                            "d1",
                            "s1",
                            "m1",
                            "m2",
                            "m6",
                            "m9",
                            "m12",
                            "m18"
                        ],
                        "x-enum-rotulos": {
                            "d1": "Dia 1",
                            "s1": "Semana 1",
                            "m1": "Mês 1",
                            "m2": "Mês 2",
                            "m6": "Mês 6",
                            "m9": "Mês 9",
                            "m12": "Mês 12",
                            "m18": "Mês 18"
                        }
                    },
                    "data_prevista": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data prevista"
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "pendente",
                            "fotos_enviadas",
                            "revisto",
                            "concluido",
                            "em_atraso",
                            "falhado"
                        ],
                        "x-enum-rotulos": {
                            "pendente": "Pendente",
                            "fotos_enviadas": "Fotos enviadas",
                            "revisto": "Revisto",
                            "concluido": "Concluído",
                            "em_atraso": "Em atraso",
                            "falhado": "Falhado"
                        },
                        "default": "pendente"
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Episódio",
                        "minimum": 1
                    },
                    "cirurgia_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Cirurgia",
                        "minimum": 1
                    },
                    "marcacao_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Marcação",
                        "minimum": 1
                    },
                    "captura_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Captura",
                        "x-anagen-recurso": "capturas",
                        "x-anagen-permissao": "ficha.captura"
                    },
                    "resposta_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Questionário",
                        "minimum": 1
                    },
                    "nps": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Índice de recomendação (0–10)",
                        "maximum": 10,
                        "minimum": 0
                    },
                    "densidade_obtida": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Densidade obtida",
                        "maximum": 250,
                        "minimum": 0,
                        "x-unidade": "UF/cm²",
                        "x-casas": 1,
                        "x-anagen-permissao": "ficha.captura"
                    },
                    "densidades_zona": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Densidade obtida por zona",
                        "description": "JSON em UF/cm²: {\"linha_frontal\": 23.4, \"coroa\": 17.8}.",
                        "x-anagen-permissao": "ficha.captura"
                    },
                    "metricas": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Métricas",
                        "description": "JSON: {\"racio_terminal_vellus\": 4.2, \"calibre_mm\": 0.062, \"pct_terminais\": 78}.",
                        "x-anagen-permissao": "ficha.captura"
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas clínicas",
                        "maxLength": 4000,
                        "x-anagen-permissao": "ficha.clinica",
                        "x-anagen-cifrado": "clinico"
                    },
                    "revisto_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Revisto por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "revisto_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Revisto em",
                        "readOnly": true
                    },
                    "concluido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Concluído em",
                        "readOnly": true
                    },
                    "tarefa_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Tarefa de recuperação",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-clinico": true
            },
            "Recurso_marcos_acompanhamento_Entrada": {
                "type": "object",
                "properties": {
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "marco": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Marco",
                        "enum": [
                            "d1",
                            "s1",
                            "m1",
                            "m2",
                            "m6",
                            "m9",
                            "m12",
                            "m18"
                        ],
                        "x-enum-rotulos": {
                            "d1": "Dia 1",
                            "s1": "Semana 1",
                            "m1": "Mês 1",
                            "m2": "Mês 2",
                            "m6": "Mês 6",
                            "m9": "Mês 9",
                            "m12": "Mês 12",
                            "m18": "Mês 18"
                        }
                    },
                    "data_prevista": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data prevista"
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "pendente",
                            "fotos_enviadas",
                            "revisto",
                            "concluido",
                            "em_atraso",
                            "falhado"
                        ],
                        "x-enum-rotulos": {
                            "pendente": "Pendente",
                            "fotos_enviadas": "Fotos enviadas",
                            "revisto": "Revisto",
                            "concluido": "Concluído",
                            "em_atraso": "Em atraso",
                            "falhado": "Falhado"
                        },
                        "default": "pendente"
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Episódio",
                        "minimum": 1
                    },
                    "cirurgia_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Cirurgia",
                        "minimum": 1
                    },
                    "marcacao_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Marcação",
                        "minimum": 1
                    },
                    "captura_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Captura",
                        "x-anagen-recurso": "capturas",
                        "x-anagen-permissao": "ficha.captura"
                    },
                    "resposta_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Questionário",
                        "minimum": 1
                    },
                    "nps": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Índice de recomendação (0–10)",
                        "maximum": 10,
                        "minimum": 0
                    },
                    "densidade_obtida": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Densidade obtida",
                        "maximum": 250,
                        "minimum": 0,
                        "x-unidade": "UF/cm²",
                        "x-casas": 1,
                        "x-anagen-permissao": "ficha.captura"
                    },
                    "densidades_zona": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Densidade obtida por zona",
                        "description": "JSON em UF/cm²: {\"linha_frontal\": 23.4, \"coroa\": 17.8}.",
                        "x-anagen-permissao": "ficha.captura"
                    },
                    "metricas": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Métricas",
                        "description": "JSON: {\"racio_terminal_vellus\": 4.2, \"calibre_mm\": 0.062, \"pct_terminais\": 78}.",
                        "x-anagen-permissao": "ficha.captura"
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas clínicas",
                        "maxLength": 4000,
                        "x-anagen-permissao": "ficha.clinica",
                        "x-anagen-cifrado": "clinico"
                    }
                },
                "required": [
                    "paciente_id",
                    "marco",
                    "data_prevista"
                ]
            },
            "Recurso_modelos3d": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ficheiro do modelo"
                    },
                    "captura_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Captura",
                        "x-anagen-recurso": "capturas"
                    },
                    "formato": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Formato",
                        "enum": [
                            "glb",
                            "gltf",
                            "obj",
                            "ply",
                            "stl",
                            "usdz"
                        ],
                        "x-enum-rotulos": {
                            "glb": "GLB",
                            "gltf": "glTF",
                            "obj": "OBJ",
                            "ply": "PLY",
                            "stl": "STL",
                            "usdz": "USDZ"
                        },
                        "readOnly": true
                    },
                    "cobertura_pct": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Cobertura",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2
                    },
                    "escala_confirmada": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Escala confirmada",
                        "description": "Confirmada com a referência de dimensão conhecida (autocolante)."
                    },
                    "qualidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Qualidade",
                        "enum": [
                            "boa",
                            "aceitavel",
                            "insuficiente"
                        ],
                        "x-enum-rotulos": {
                            "boa": "Boa",
                            "aceitavel": "Aceitável",
                            "insuficiente": "Insuficiente"
                        }
                    },
                    "referencias": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Pontos anatómicos",
                        "description": "JSON com glabela, tragus_e, tragus_d, occipital e vertice: {\"glabela\": {\"x\": 0, \"y\": 0, \"z\": 0}, …}."
                    },
                    "zonas": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Áreas por zona",
                        "description": "Áreas medidas na malha, em cm²: {\"linha_frontal\": 15.2, \"coroa\": 68.9}."
                    },
                    "area_dadora_cm2": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Área dadora medida",
                        "maximum": 800,
                        "minimum": 0,
                        "x-unidade": "cm²",
                        "x-casas": 1
                    },
                    "partilhado_paciente": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Partilhada com o paciente"
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas clínicas",
                        "maxLength": 4000,
                        "x-anagen-cifrado": "clinico"
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-clinico": true
            },
            "Recurso_modelos3d_Entrada": {
                "type": "object",
                "properties": {
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ficheiro do modelo"
                    },
                    "captura_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Captura",
                        "x-anagen-recurso": "capturas"
                    },
                    "cobertura_pct": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Cobertura",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2
                    },
                    "escala_confirmada": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Escala confirmada",
                        "description": "Confirmada com a referência de dimensão conhecida (autocolante)."
                    },
                    "qualidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Qualidade",
                        "enum": [
                            "boa",
                            "aceitavel",
                            "insuficiente"
                        ],
                        "x-enum-rotulos": {
                            "boa": "Boa",
                            "aceitavel": "Aceitável",
                            "insuficiente": "Insuficiente"
                        }
                    },
                    "referencias": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Pontos anatómicos",
                        "description": "JSON com glabela, tragus_e, tragus_d, occipital e vertice: {\"glabela\": {\"x\": 0, \"y\": 0, \"z\": 0}, …}."
                    },
                    "zonas": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Áreas por zona",
                        "description": "Áreas medidas na malha, em cm²: {\"linha_frontal\": 15.2, \"coroa\": 68.9}."
                    },
                    "area_dadora_cm2": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Área dadora medida",
                        "maximum": 800,
                        "minimum": 0,
                        "x-unidade": "cm²",
                        "x-casas": 1
                    },
                    "partilhado_paciente": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Partilhada com o paciente"
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas clínicas",
                        "maxLength": 4000,
                        "x-anagen-cifrado": "clinico"
                    }
                },
                "required": [
                    "paciente_id",
                    "ficheiro_id"
                ]
            },
            "Recurso_motor_versoes": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "versao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Versão",
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "rascunho",
                            "aprovada",
                            "arquivada"
                        ],
                        "x-enum-rotulos": {
                            "rascunho": "Rascunho",
                            "aprovada": "Aprovada",
                            "arquivada": "Arquivada"
                        },
                        "readOnly": true
                    },
                    "base_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Criada a partir de",
                        "x-anagen-recurso": "motor_versoes",
                        "readOnly": true
                    },
                    "aprovado_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Aprovado por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "aprovado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Aprovado em",
                        "readOnly": true
                    },
                    "arquivado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Arquivada em",
                        "readOnly": true
                    },
                    "finalidade_regulamentar": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Finalidade regulamentar",
                        "readOnly": true
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas clínicas",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-clinico": false
            },
            "Recurso_motor_versoes_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_objetivos_comerciais": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "periodo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Mês",
                        "description": "No formato AAAA-MM.",
                        "maxLength": 7,
                        "pattern": "/^\\d{4}-(0[1-9]|1[0-2])$/"
                    },
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Pessoa",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "equipa_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Equipa",
                        "x-anagen-recurso": "equipas"
                    },
                    "metrica": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Métrica",
                        "enum": [
                            "leads_novos",
                            "consultas_marcadas",
                            "propostas",
                            "cirurgias_marcadas",
                            "ganhos",
                            "valor_ganho"
                        ],
                        "x-enum-rotulos": {
                            "leads_novos": "Leads novos",
                            "consultas_marcadas": "Consultas marcadas",
                            "propostas": "Propostas",
                            "cirurgias_marcadas": "Cirurgias marcadas",
                            "ganhos": "Ganhos",
                            "valor_ganho": "Valor ganho"
                        }
                    },
                    "alvo": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Objetivo",
                        "minimum": 0,
                        "x-casas": 2
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-clinico": false
            },
            "Recurso_objetivos_comerciais_Entrada": {
                "type": "object",
                "properties": {
                    "periodo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Mês",
                        "description": "No formato AAAA-MM.",
                        "maxLength": 7,
                        "pattern": "/^\\d{4}-(0[1-9]|1[0-2])$/"
                    },
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Pessoa",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "equipa_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Equipa",
                        "x-anagen-recurso": "equipas"
                    },
                    "metrica": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Métrica",
                        "enum": [
                            "leads_novos",
                            "consultas_marcadas",
                            "propostas",
                            "cirurgias_marcadas",
                            "ganhos",
                            "valor_ganho"
                        ],
                        "x-enum-rotulos": {
                            "leads_novos": "Leads novos",
                            "consultas_marcadas": "Consultas marcadas",
                            "propostas": "Propostas",
                            "cirurgias_marcadas": "Cirurgias marcadas",
                            "ganhos": "Ganhos",
                            "valor_ganho": "Valor ganho"
                        }
                    },
                    "alvo": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Objetivo",
                        "minimum": 0,
                        "x-casas": 2
                    }
                },
                "required": [
                    "periodo",
                    "metrica",
                    "alvo"
                ]
            },
            "Recurso_pacientes": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "numero": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "N.º de processo",
                        "description": "Atribuído automaticamente ao criar o paciente.",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 100
                    },
                    "apelidos": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Apelidos",
                        "maxLength": 120
                    },
                    "nome_completo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome completo",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "sexo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Sexo",
                        "enum": [
                            "F",
                            "M",
                            "X"
                        ],
                        "x-enum-rotulos": {
                            "F": "Feminino",
                            "M": "Masculino",
                            "X": "Outro / não especificado"
                        }
                    },
                    "data_nascimento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data de nascimento",
                        "description": "Necessária para verificar a idade mínima na elegibilidade."
                    },
                    "nif": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{9}$",
                        "title": "NIF",
                        "description": "Guardado cifrado. Pesquisa-se pelo número completo.",
                        "x-anagen-cifrado": "geral"
                    },
                    "documento_tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo de documento",
                        "enum": [
                            "cc",
                            "passaporte",
                            "titulo_residencia",
                            "bi",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "cc": "Cartão de Cidadão",
                            "passaporte": "Passaporte",
                            "titulo_residencia": "Título de residência",
                            "bi": "Bilhete de Identidade",
                            "outro": "Outro"
                        }
                    },
                    "documento_numero": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "N.º do documento",
                        "maxLength": 40,
                        "x-anagen-cifrado": "geral"
                    },
                    "email": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "email",
                        "title": "Email"
                    },
                    "telefone": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Telefone",
                        "description": "Com o indicativo internacional, por exemplo +351 912 345 678."
                    },
                    "telefone_alt": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Telefone alternativo"
                    },
                    "morada": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Morada",
                        "maxLength": 255
                    },
                    "codigo_postal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Código postal",
                        "maxLength": 12
                    },
                    "localidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Localidade",
                        "maxLength": 100
                    },
                    "pais": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "País",
                        "description": "Código do país com duas letras, por exemplo PT, BR ou ES.",
                        "maxLength": 2,
                        "pattern": "/^[A-Za-z]{2}$/"
                    },
                    "nacionalidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nacionalidade",
                        "description": "Código do país com duas letras, por exemplo PT, BR ou ES.",
                        "maxLength": 2,
                        "pattern": "/^[A-Za-z]{2}$/"
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Idioma",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português (Portugal)",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        },
                        "default": "pt-PT"
                    },
                    "profissao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Profissão",
                        "maxLength": 120
                    },
                    "medico_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Médico assistente",
                        "description": "Médico de referência do paciente, com acesso à ficha clínica.",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Responsável",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "origem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Origem",
                        "enum": [
                            "site",
                            "pre_avaliacao",
                            "recomendacao",
                            "telefone",
                            "presencial",
                            "redes",
                            "agente",
                            "importacao",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "site": "Site",
                            "pre_avaliacao": "Pré-avaliação online",
                            "recomendacao": "Recomendação",
                            "telefone": "Telefone",
                            "presencial": "Presencial",
                            "redes": "Redes sociais",
                            "agente": "Agente virtual",
                            "importacao": "Importação",
                            "outro": "Outro"
                        }
                    },
                    "recomendado_por_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Recomendado por",
                        "x-anagen-recurso": "pacientes"
                    },
                    "cliente_desde": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Paciente desde",
                        "description": "Data do início da relação com a clínica (útil em pacientes importados)."
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "ativo",
                            "arquivado",
                            "anonimizado"
                        ],
                        "x-enum-rotulos": {
                            "ativo": "Ativo",
                            "arquivado": "Arquivado",
                            "anonimizado": "Anonimizado"
                        },
                        "readOnly": true
                    },
                    "portal_ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Portal do paciente ativo",
                        "readOnly": true
                    },
                    "litigio": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Em litígio",
                        "description": "Assinala um processo em litígio: a ficha mostra um aviso a toda a equipa."
                    },
                    "notas_admin": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas administrativas",
                        "description": "Notas internas, sem conteúdo clínico. Guardadas cifradas.",
                        "x-anagen-cifrado": "geral"
                    },
                    "ignorar_duplicados": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Gravar mesmo com possíveis duplicados",
                        "description": "Marque apenas depois de confirmar que não se trata da mesma pessoa."
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-clinico": false
            },
            "Recurso_pacientes_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 100
                    },
                    "apelidos": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Apelidos",
                        "maxLength": 120
                    },
                    "sexo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Sexo",
                        "enum": [
                            "F",
                            "M",
                            "X"
                        ],
                        "x-enum-rotulos": {
                            "F": "Feminino",
                            "M": "Masculino",
                            "X": "Outro / não especificado"
                        }
                    },
                    "data_nascimento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Data de nascimento",
                        "description": "Necessária para verificar a idade mínima na elegibilidade."
                    },
                    "nif": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{9}$",
                        "title": "NIF",
                        "description": "Guardado cifrado. Pesquisa-se pelo número completo.",
                        "x-anagen-cifrado": "geral"
                    },
                    "documento_tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo de documento",
                        "enum": [
                            "cc",
                            "passaporte",
                            "titulo_residencia",
                            "bi",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "cc": "Cartão de Cidadão",
                            "passaporte": "Passaporte",
                            "titulo_residencia": "Título de residência",
                            "bi": "Bilhete de Identidade",
                            "outro": "Outro"
                        }
                    },
                    "documento_numero": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "N.º do documento",
                        "maxLength": 40,
                        "x-anagen-cifrado": "geral"
                    },
                    "email": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "email",
                        "title": "Email"
                    },
                    "telefone": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Telefone",
                        "description": "Com o indicativo internacional, por exemplo +351 912 345 678."
                    },
                    "telefone_alt": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Telefone alternativo"
                    },
                    "morada": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Morada",
                        "maxLength": 255
                    },
                    "codigo_postal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Código postal",
                        "maxLength": 12
                    },
                    "localidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Localidade",
                        "maxLength": 100
                    },
                    "pais": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "País",
                        "description": "Código do país com duas letras, por exemplo PT, BR ou ES.",
                        "maxLength": 2,
                        "pattern": "/^[A-Za-z]{2}$/"
                    },
                    "nacionalidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nacionalidade",
                        "description": "Código do país com duas letras, por exemplo PT, BR ou ES.",
                        "maxLength": 2,
                        "pattern": "/^[A-Za-z]{2}$/"
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Idioma",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português (Portugal)",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        },
                        "default": "pt-PT"
                    },
                    "profissao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Profissão",
                        "maxLength": 120
                    },
                    "medico_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Médico assistente",
                        "description": "Médico de referência do paciente, com acesso à ficha clínica.",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Responsável",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "origem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Origem",
                        "enum": [
                            "site",
                            "pre_avaliacao",
                            "recomendacao",
                            "telefone",
                            "presencial",
                            "redes",
                            "agente",
                            "importacao",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "site": "Site",
                            "pre_avaliacao": "Pré-avaliação online",
                            "recomendacao": "Recomendação",
                            "telefone": "Telefone",
                            "presencial": "Presencial",
                            "redes": "Redes sociais",
                            "agente": "Agente virtual",
                            "importacao": "Importação",
                            "outro": "Outro"
                        }
                    },
                    "recomendado_por_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Recomendado por",
                        "x-anagen-recurso": "pacientes"
                    },
                    "cliente_desde": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Paciente desde",
                        "description": "Data do início da relação com a clínica (útil em pacientes importados)."
                    },
                    "litigio": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Em litígio",
                        "description": "Assinala um processo em litígio: a ficha mostra um aviso a toda a equipa."
                    },
                    "notas_admin": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas administrativas",
                        "description": "Notas internas, sem conteúdo clínico. Guardadas cifradas.",
                        "x-anagen-cifrado": "geral"
                    },
                    "ignorar_duplicados": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Gravar mesmo com possíveis duplicados",
                        "description": "Marque apenas depois de confirmar que não se trata da mesma pessoa."
                    }
                },
                "required": [
                    "nome"
                ]
            },
            "Recurso_pacientes_alertas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "alergia",
                            "medicacao",
                            "anticoagulante",
                            "condicao",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "alergia": "Alergia",
                            "medicacao": "Medicação",
                            "anticoagulante": "Anticoagulante",
                            "condicao": "Condição clínica",
                            "outro": "Outro"
                        }
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "description": "Indique a substância, o medicamento ou a condição e, quando relevante, a reação ou a dose.",
                        "maxLength": 2000,
                        "x-anagen-cifrado": "clinico"
                    },
                    "gravidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Gravidade",
                        "enum": [
                            "baixa",
                            "media",
                            "alta"
                        ],
                        "x-enum-rotulos": {
                            "baixa": "Baixa",
                            "media": "Média",
                            "alta": "Alta"
                        },
                        "default": "media"
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "validado": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Validado",
                        "readOnly": true
                    },
                    "origem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Origem",
                        "enum": [
                            "equipa",
                            "paciente",
                            "agente",
                            "formulario",
                            "importacao"
                        ],
                        "x-enum-rotulos": {
                            "equipa": "Equipa",
                            "paciente": "Paciente",
                            "agente": "Agente virtual",
                            "formulario": "Formulário",
                            "importacao": "Importação"
                        },
                        "readOnly": true
                    },
                    "validado_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Validado por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "validado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Validado em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "ficha.clinica",
                "x-anagen-clinico": true
            },
            "Recurso_pacientes_alertas_Entrada": {
                "type": "object",
                "properties": {
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "alergia",
                            "medicacao",
                            "anticoagulante",
                            "condicao",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "alergia": "Alergia",
                            "medicacao": "Medicação",
                            "anticoagulante": "Anticoagulante",
                            "condicao": "Condição clínica",
                            "outro": "Outro"
                        }
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "description": "Indique a substância, o medicamento ou a condição e, quando relevante, a reação ou a dose.",
                        "maxLength": 2000,
                        "x-anagen-cifrado": "clinico"
                    },
                    "gravidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Gravidade",
                        "enum": [
                            "baixa",
                            "media",
                            "alta"
                        ],
                        "x-enum-rotulos": {
                            "baixa": "Baixa",
                            "media": "Média",
                            "alta": "Alta"
                        },
                        "default": "media"
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    }
                },
                "required": [
                    "paciente_id",
                    "tipo",
                    "descricao",
                    "gravidade"
                ]
            },
            "Recurso_pagamentos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes",
                        "readOnly": true
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "sinal",
                            "intercalar",
                            "restante",
                            "consulta",
                            "teleconsulta",
                            "tratamento",
                            "outro",
                            "adiantamento",
                            "pre_pagamento",
                            "vale",
                            "comparticipacao"
                        ],
                        "x-enum-rotulos": {
                            "sinal": "Sinal",
                            "intercalar": "Pagamento intercalar",
                            "restante": "Restante",
                            "consulta": "Consulta",
                            "teleconsulta": "Teleconsulta",
                            "tratamento": "Tratamento",
                            "outro": "Outro",
                            "adiantamento": "Adiantamento",
                            "pre_pagamento": "Pré-pagamento",
                            "vale": "Vale de oferta",
                            "comparticipacao": "Comparticipação"
                        },
                        "readOnly": true
                    },
                    "valor": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Valor",
                        "x-moeda": "EUR",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "metodo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Método",
                        "enum": [
                            "mbway",
                            "multibanco",
                            "cartao",
                            "numerario",
                            "transferencia",
                            "ligacao",
                            "financiamento",
                            "carteira",
                            "vale"
                        ],
                        "x-enum-rotulos": {
                            "mbway": "MB WAY",
                            "multibanco": "Referência Multibanco",
                            "cartao": "Cartão (terminal)",
                            "numerario": "Numerário",
                            "transferencia": "Transferência bancária",
                            "ligacao": "Ligação de pagamento",
                            "financiamento": "Financiamento",
                            "carteira": "Saldo da carteira",
                            "vale": "Vale de oferta"
                        },
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "pendente",
                            "pago",
                            "falhado",
                            "expirado",
                            "reembolsado",
                            "cancelado"
                        ],
                        "x-enum-rotulos": {
                            "pendente": "Por pagar",
                            "pago": "Pago",
                            "falhado": "Falhado",
                            "expirado": "Expirado",
                            "reembolsado": "Reembolsado",
                            "cancelado": "Cancelado"
                        },
                        "readOnly": true
                    },
                    "vence_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Vence em"
                    },
                    "pago_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Pago em",
                        "readOnly": true
                    },
                    "mb_entidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Entidade",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "mb_referencia": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Referência",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "mb_validade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Validade da referência",
                        "readOnly": true
                    },
                    "telefone_mascarado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Telemóvel MB WAY",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "confirmacao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Confirmação",
                        "enum": [
                            "api",
                            "callback",
                            "manual"
                        ],
                        "x-enum-rotulos": {
                            "api": "Consulta ao fornecedor",
                            "callback": "Aviso do fornecedor",
                            "manual": "Confirmação manual"
                        },
                        "readOnly": true
                    },
                    "proposta_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Proposta",
                        "x-anagen-recurso": "propostas",
                        "readOnly": true
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Episódio",
                        "readOnly": true
                    },
                    "caixa_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Caixa",
                        "x-anagen-recurso": "caixas",
                        "readOnly": true
                    },
                    "local_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Local",
                        "x-anagen-recurso": "locais",
                        "readOnly": true
                    },
                    "conta_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Conta pagadora",
                        "x-anagen-recurso": "contas_pagadoras",
                        "readOnly": true
                    },
                    "convencao_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Convenção",
                        "x-anagen-recurso": "convencoes",
                        "readOnly": true
                    },
                    "terminal_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Terminal",
                        "x-anagen-recurso": "terminais_pagamento",
                        "readOnly": true
                    },
                    "vale_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Vale",
                        "x-anagen-recurso": "vales",
                        "readOnly": true
                    },
                    "grupo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Ato repartido",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "documento_fiscal_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Documento fiscal",
                        "x-anagen-recurso": "documentos_fiscais",
                        "readOnly": true
                    },
                    "recebido_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Recebido por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 2000
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-clinico": false
            },
            "Recurso_pagamentos_Entrada": {
                "type": "object",
                "properties": {
                    "vence_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Vence em"
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 2000
                    }
                }
            },
            "Recurso_parceiros": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "organizacao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Organização",
                        "maxLength": 190
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160,
                        "x-anagen-cifrado": "geral"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "medico",
                            "clinica",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "medico": "Médico",
                            "clinica": "Clínica",
                            "outro": "Outro"
                        }
                    },
                    "email": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "email",
                        "title": "Email",
                        "maxLength": 190,
                        "x-anagen-cifrado": "geral"
                    },
                    "telefone": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Telefone",
                        "maxLength": 25,
                        "x-anagen-cifrado": "geral"
                    },
                    "cedula": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Cédula profissional",
                        "maxLength": 30
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "pendente_email",
                            "pendente_aprovacao",
                            "ativo",
                            "suspenso",
                            "recusado"
                        ],
                        "x-enum-rotulos": {
                            "pendente_email": "Email por confirmar",
                            "pendente_aprovacao": "Por aprovar",
                            "ativo": "Ativa",
                            "suspenso": "Suspensa",
                            "recusado": "Recusada"
                        },
                        "readOnly": true
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Responsável na clínica",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "notas_internas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas internas",
                        "description": "Só para a equipa. Guardadas cifradas.",
                        "maxLength": 4000,
                        "x-anagen-cifrado": "geral"
                    },
                    "email_verificado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Email confirmado em",
                        "readOnly": true
                    },
                    "aprovado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Aprovado em",
                        "readOnly": true
                    },
                    "ultimo_acesso_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Último acesso",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-clinico": false
            },
            "Recurso_parceiros_Entrada": {
                "type": "object",
                "properties": {
                    "organizacao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Organização",
                        "maxLength": 190
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160,
                        "x-anagen-cifrado": "geral"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "medico",
                            "clinica",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "medico": "Médico",
                            "clinica": "Clínica",
                            "outro": "Outro"
                        }
                    },
                    "email": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "email",
                        "title": "Email",
                        "maxLength": 190,
                        "x-anagen-cifrado": "geral"
                    },
                    "telefone": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Telefone",
                        "maxLength": 25,
                        "x-anagen-cifrado": "geral"
                    },
                    "cedula": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Cédula profissional",
                        "maxLength": 30
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Responsável na clínica",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "notas_internas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas internas",
                        "description": "Só para a equipa. Guardadas cifradas.",
                        "maxLength": 4000,
                        "x-anagen-cifrado": "geral"
                    }
                }
            },
            "Recurso_parceiros_encaminhamentos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "codigo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Código",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "parceiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Parceiro",
                        "x-anagen-recurso": "parceiros",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome do paciente",
                        "maxLength": 255,
                        "x-anagen-cifrado": "geral",
                        "readOnly": true
                    },
                    "contacto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Contacto",
                        "maxLength": 255,
                        "x-anagen-cifrado": "geral",
                        "readOnly": true
                    },
                    "nota": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nota do parceiro",
                        "x-anagen-cifrado": "geral",
                        "readOnly": true
                    },
                    "procedimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Interesse",
                        "x-anagen-recurso": "procedimentos",
                        "readOnly": true
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Lead",
                        "description": "Criado automaticamente; corrija se ficou ligado ao lead errado.",
                        "x-anagen-recurso": "leads"
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "description": "Necessário para registar a autorização do paciente.",
                        "x-anagen-recurso": "pacientes"
                    },
                    "estado_manual": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado mostrado ao parceiro",
                        "description": "Vazio = calculado a partir do lead.",
                        "enum": [
                            "recebido",
                            "em_contacto",
                            "avaliacao",
                            "concluido",
                            "sem_seguimento"
                        ],
                        "x-enum-rotulos": {
                            "recebido": "Recebido",
                            "em_contacto": "Em contacto",
                            "avaliacao": "Em avaliação",
                            "concluido": "Avançou com a clínica",
                            "sem_seguimento": "Sem seguimento"
                        }
                    },
                    "origem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Origem",
                        "enum": [
                            "web",
                            "app"
                        ],
                        "x-enum-rotulos": {
                            "web": "Web",
                            "app": "App"
                        },
                        "readOnly": true
                    },
                    "declaracao_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Declaração de contacto em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-clinico": false
            },
            "Recurso_parceiros_encaminhamentos_Entrada": {
                "type": "object",
                "properties": {
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Lead",
                        "description": "Criado automaticamente; corrija se ficou ligado ao lead errado.",
                        "x-anagen-recurso": "leads"
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "description": "Necessário para registar a autorização do paciente.",
                        "x-anagen-recurso": "pacientes"
                    },
                    "estado_manual": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado mostrado ao parceiro",
                        "description": "Vazio = calculado a partir do lead.",
                        "enum": [
                            "recebido",
                            "em_contacto",
                            "avaliacao",
                            "concluido",
                            "sem_seguimento"
                        ],
                        "x-enum-rotulos": {
                            "recebido": "Recebido",
                            "em_contacto": "Em contacto",
                            "avaliacao": "Em avaliação",
                            "concluido": "Avançou com a clínica",
                            "sem_seguimento": "Sem seguimento"
                        }
                    }
                }
            },
            "Recurso_pedidos_titulares": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Pedido",
                        "enum": [
                            "acesso",
                            "retificacao",
                            "portabilidade",
                            "apagamento",
                            "oposicao",
                            "limitacao"
                        ],
                        "x-enum-rotulos": {
                            "acesso": "Acesso",
                            "retificacao": "Retificação",
                            "portabilidade": "Portabilidade",
                            "apagamento": "Apagamento",
                            "oposicao": "Oposição",
                            "limitacao": "Limitação"
                        }
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "nome_requerente": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome do requerente",
                        "description": "Quando o pedido não vem de um paciente ou contacto registado.",
                        "maxLength": 160
                    },
                    "contacto_requerente": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Contacto do requerente",
                        "maxLength": 190,
                        "x-anagen-cifrado": "geral"
                    },
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal",
                        "enum": [
                            "portal",
                            "email",
                            "presencial",
                            "telefone",
                            "carta",
                            "app"
                        ],
                        "x-enum-rotulos": {
                            "portal": "Portal do paciente",
                            "email": "Email",
                            "presencial": "Presencial",
                            "telefone": "Telefone",
                            "carta": "Carta",
                            "app": "Aplicação móvel"
                        },
                        "default": "presencial"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição do pedido",
                        "maxLength": 5000,
                        "x-anagen-cifrado": "geral"
                    },
                    "recebido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Recebido em"
                    },
                    "prazo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Prazo",
                        "readOnly": true
                    },
                    "prorrogado_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Prorrogado até",
                        "readOnly": true
                    },
                    "prorrogacao_motivo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo da prorrogação",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "recebido",
                            "em_analise",
                            "concluido",
                            "recusado"
                        ],
                        "x-enum-rotulos": {
                            "recebido": "Recebido",
                            "em_analise": "Em análise",
                            "concluido": "Concluído",
                            "recusado": "Recusado"
                        },
                        "default": "recebido"
                    },
                    "identidade_verificada": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Identidade verificada",
                        "description": "Confirme a identidade antes de responder (documento, conta do portal autenticada ou dados que só o titular conhece)."
                    },
                    "tratado_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Tratado por",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "respondido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Respondido em",
                        "readOnly": true
                    },
                    "resposta": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resposta",
                        "maxLength": 10000,
                        "x-anagen-cifrado": "geral"
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ficheiro entregue"
                    },
                    "portal_conta_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Conta do portal",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-clinico": false
            },
            "Recurso_pedidos_titulares_Entrada": {
                "type": "object",
                "properties": {
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Pedido",
                        "enum": [
                            "acesso",
                            "retificacao",
                            "portabilidade",
                            "apagamento",
                            "oposicao",
                            "limitacao"
                        ],
                        "x-enum-rotulos": {
                            "acesso": "Acesso",
                            "retificacao": "Retificação",
                            "portabilidade": "Portabilidade",
                            "apagamento": "Apagamento",
                            "oposicao": "Oposição",
                            "limitacao": "Limitação"
                        }
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "nome_requerente": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome do requerente",
                        "description": "Quando o pedido não vem de um paciente ou contacto registado.",
                        "maxLength": 160
                    },
                    "contacto_requerente": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Contacto do requerente",
                        "maxLength": 190,
                        "x-anagen-cifrado": "geral"
                    },
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal",
                        "enum": [
                            "portal",
                            "email",
                            "presencial",
                            "telefone",
                            "carta",
                            "app"
                        ],
                        "x-enum-rotulos": {
                            "portal": "Portal do paciente",
                            "email": "Email",
                            "presencial": "Presencial",
                            "telefone": "Telefone",
                            "carta": "Carta",
                            "app": "Aplicação móvel"
                        },
                        "default": "presencial"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição do pedido",
                        "maxLength": 5000,
                        "x-anagen-cifrado": "geral"
                    },
                    "recebido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Recebido em"
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "recebido",
                            "em_analise",
                            "concluido",
                            "recusado"
                        ],
                        "x-enum-rotulos": {
                            "recebido": "Recebido",
                            "em_analise": "Em análise",
                            "concluido": "Concluído",
                            "recusado": "Recusado"
                        },
                        "default": "recebido"
                    },
                    "identidade_verificada": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Identidade verificada",
                        "description": "Confirme a identidade antes de responder (documento, conta do portal autenticada ou dados que só o titular conhece)."
                    },
                    "tratado_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Tratado por",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "resposta": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resposta",
                        "maxLength": 10000,
                        "x-anagen-cifrado": "geral"
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ficheiro entregue"
                    }
                },
                "required": [
                    "tipo"
                ]
            },
            "Recurso_perfis": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 255
                    },
                    "departamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Família",
                        "enum": [
                            "administracao",
                            "medico",
                            "enfermagem",
                            "tecnico",
                            "comercial",
                            "rececao"
                        ],
                        "x-enum-rotulos": {
                            "administracao": "Administração",
                            "medico": "Médico",
                            "enfermagem": "Enfermagem",
                            "tecnico": "Técnico",
                            "comercial": "Comercial",
                            "rececao": "Receção"
                        }
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 255
                    },
                    "sistema": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Perfil base",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-clinico": false
            },
            "Recurso_perfis_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 255
                    },
                    "departamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Família",
                        "enum": [
                            "administracao",
                            "medico",
                            "enfermagem",
                            "tecnico",
                            "comercial",
                            "rececao"
                        ],
                        "x-enum-rotulos": {
                            "administracao": "Administração",
                            "medico": "Médico",
                            "enfermagem": "Enfermagem",
                            "tecnico": "Técnico",
                            "comercial": "Comercial",
                            "rececao": "Receção"
                        }
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 255
                    }
                }
            },
            "Recurso_planos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes",
                        "readOnly": true
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Episódio",
                        "readOnly": true
                    },
                    "versao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Versão",
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "rascunho",
                            "em_revisao",
                            "aprovado",
                            "substituido"
                        ],
                        "x-enum-rotulos": {
                            "rascunho": "Rascunho",
                            "em_revisao": "Em revisão",
                            "aprovado": "Aprovado",
                            "substituido": "Substituído"
                        },
                        "readOnly": true
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Técnica",
                        "enum": [
                            "FUE",
                            "FUT",
                            "DHI",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "FUE": "FUE",
                            "FUT": "FUT",
                            "DHI": "DHI",
                            "outra": "Outra"
                        },
                        "readOnly": true
                    },
                    "enxertos_necessarios": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Enxertos necessários",
                        "x-unidade": "enxertos",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "sessoes": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Sessões",
                        "readOnly": true
                    },
                    "escala": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Escala",
                        "enum": [
                            "norwood",
                            "ludwig",
                            "savin",
                            "sinclair",
                            "basp",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "norwood": "Norwood",
                            "ludwig": "Ludwig",
                            "savin": "Savin",
                            "sinclair": "Sinclair",
                            "basp": "BASP",
                            "outra": "Outra"
                        },
                        "readOnly": true
                    },
                    "grau": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Grau",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "capacidade_vida": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Capacidade ao longo da vida",
                        "x-unidade": "enxertos",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "capacidade_sessao": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Capacidade por sessão",
                        "x-unidade": "enxertos",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "balanco": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Balanço",
                        "x-unidade": "enxertos",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "cenario": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Cenário",
                        "enum": [
                            "conservador",
                            "provavel",
                            "agressivo"
                        ],
                        "x-enum-rotulos": {
                            "conservador": "Conservador",
                            "provavel": "Provável",
                            "agressivo": "Agressivo"
                        },
                        "readOnly": true
                    },
                    "motor_versao_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Versão dos parâmetros",
                        "x-anagen-recurso": "motor_versoes",
                        "readOnly": true
                    },
                    "impressao_digital": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Impressão digital",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "calculado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Calculado em",
                        "readOnly": true
                    },
                    "aprovado_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Aprovado por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "aprovado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Aprovado em",
                        "readOnly": true
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas clínicas",
                        "x-anagen-cifrado": "clinico",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "ficha.plano",
                "x-anagen-clinico": true
            },
            "Recurso_planos_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_portal_contas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "email": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "email",
                        "title": "Email de entrada",
                        "description": "Vazio = o email da ficha do paciente. O paciente entra com um código enviado para este email.",
                        "maxLength": 190
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "pendente",
                            "ativa",
                            "suspensa",
                            "eliminacao_pedida"
                        ],
                        "x-enum-rotulos": {
                            "pendente": "Por confirmar",
                            "ativa": "Ativa",
                            "suspensa": "Suspensa",
                            "eliminacao_pedida": "Eliminação pedida"
                        },
                        "readOnly": true
                    },
                    "email_verificado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Email confirmado em",
                        "readOnly": true
                    },
                    "ultimo_acesso_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Último acesso",
                        "readOnly": true
                    },
                    "eliminacao_pedida_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Eliminação pedida em",
                        "readOnly": true
                    },
                    "tem_palavra_passe": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Tem palavra-passe",
                        "readOnly": true
                    },
                    "canal_preferido": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal preferido",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "idioma_portal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua do portal",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-clinico": false
            },
            "Recurso_portal_contas_Entrada": {
                "type": "object",
                "properties": {
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "email": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "email",
                        "title": "Email de entrada",
                        "description": "Vazio = o email da ficha do paciente. O paciente entra com um código enviado para este email.",
                        "maxLength": 190
                    }
                },
                "required": [
                    "paciente_id"
                ]
            },
            "Recurso_portal_pedidos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes",
                        "readOnly": true
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "contactos",
                            "alergias",
                            "acesso",
                            "retificacao",
                            "portabilidade",
                            "apagamento",
                            "oposicao",
                            "limitacao",
                            "eliminar_conta"
                        ],
                        "x-enum-rotulos": {
                            "contactos": "Atualizar contactos",
                            "alergias": "Alergias",
                            "acesso": "Direito de acesso",
                            "retificacao": "Retificação",
                            "portabilidade": "Portabilidade",
                            "apagamento": "Apagamento",
                            "oposicao": "Oposição",
                            "limitacao": "Limitação",
                            "eliminar_conta": "Eliminar conta"
                        },
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "pendente",
                            "em_analise",
                            "aceite",
                            "recusado",
                            "concluido",
                            "cancelado"
                        ],
                        "x-enum-rotulos": {
                            "pendente": "Recebido",
                            "em_analise": "Em análise",
                            "aceite": "Aceite",
                            "recusado": "Recusado",
                            "concluido": "Concluído",
                            "cancelado": "Cancelado"
                        },
                        "readOnly": true
                    },
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal",
                        "enum": [
                            "web",
                            "app"
                        ],
                        "x-enum-rotulos": {
                            "web": "Portal web",
                            "app": "Aplicação"
                        },
                        "readOnly": true
                    },
                    "prazo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Prazo legal",
                        "readOnly": true
                    },
                    "alteracoes": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Alterações propostas",
                        "readOnly": true
                    },
                    "alteracoes_clinicas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Alergias comunicadas",
                        "x-anagen-permissao": "ficha.clinica",
                        "readOnly": true
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição do paciente",
                        "x-anagen-cifrado": "geral",
                        "readOnly": true
                    },
                    "resposta": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resposta ao paciente",
                        "x-anagen-cifrado": "geral",
                        "readOnly": true
                    },
                    "decidido_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Tratado por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "decidido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Tratado em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "ficha.identificacao",
                "x-anagen-clinico": false
            },
            "Recurso_portal_pedidos_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_pre_avaliacoes": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "recebida",
                            "em_revisao",
                            "revista",
                            "respondida"
                        ],
                        "x-enum-rotulos": {
                            "recebida": "Recebida",
                            "em_revisao": "Em revisão",
                            "revista": "Revista",
                            "respondida": "Respondida"
                        },
                        "readOnly": true
                    },
                    "procedimento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Área de interesse",
                        "enum": [
                            "couro_cabeludo",
                            "barba",
                            "sobrancelhas",
                            "feminina",
                            "reparacao",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "couro_cabeludo": "Couro cabeludo",
                            "barba": "Barba",
                            "sobrancelhas": "Sobrancelhas",
                            "feminina": "Queda de cabelo na mulher",
                            "reparacao": "Corrigir um transplante anterior",
                            "outra": "Outra"
                        },
                        "readOnly": true
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt",
                            "en"
                        ],
                        "x-enum-rotulos": "Português",
                        "readOnly": true
                    },
                    "origem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Origem",
                        "enum": [
                            "site",
                            "app"
                        ],
                        "x-enum-rotulos": {
                            "site": "Site",
                            "app": "App"
                        },
                        "readOnly": true
                    },
                    "triagem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Triagem orientativa",
                        "enum": [
                            "elegivel_provavel",
                            "avaliar",
                            "nao_elegivel_provavel"
                        ],
                        "x-enum-rotulos": {
                            "elegivel_provavel": "Seguir para consulta",
                            "avaliar": "Avaliar com atenção",
                            "nao_elegivel_provavel": "Sugerir consulta primeiro"
                        },
                        "x-anagen-permissao": "ficha.clinica",
                        "readOnly": true
                    },
                    "parecer": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Parecer médico",
                        "enum": [
                            "consulta",
                            "teleconsulta",
                            "mais_fotos",
                            "nao_elegivel",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "consulta": "Marcar consulta presencial",
                            "teleconsulta": "Marcar teleconsulta",
                            "mais_fotos": "Pedir mais fotografias",
                            "nao_elegivel": "Conversa sobre outras opções",
                            "outro": "Outro (contacto da equipa)"
                        },
                        "readOnly": true
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Lead",
                        "readOnly": true
                    },
                    "revisto_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Revista em",
                        "readOnly": true
                    },
                    "respondido_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Respondida em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-clinico": false
            },
            "Recurso_pre_avaliacoes_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_procedimentos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "nome_en": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome em inglês",
                        "description": "Usado nas propostas em inglês.",
                        "maxLength": 160
                    },
                    "codigo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Código",
                        "maxLength": 30,
                        "pattern": "^[A-Za-z0-9_\\-]{1,30}$"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "consulta",
                            "cirurgia",
                            "tratamento",
                            "exame",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "consulta": "Consulta",
                            "cirurgia": "Cirurgia",
                            "tratamento": "Tratamento",
                            "exame": "Exame",
                            "outro": "Outro"
                        },
                        "default": "cirurgia"
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Técnica",
                        "enum": [
                            "FUE",
                            "FUT",
                            "DHI",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "FUE": "FUE",
                            "FUT": "FUT",
                            "DHI": "Implantação com implantadores (DHI)",
                            "outra": "Outra"
                        }
                    },
                    "area": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Área",
                        "enum": [
                            "couro_cabeludo",
                            "barba",
                            "sobrancelhas",
                            "feminina",
                            "reparacao",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "couro_cabeludo": "Couro cabeludo",
                            "barba": "Barba",
                            "sobrancelhas": "Sobrancelhas",
                            "feminina": "Capilar feminina",
                            "reparacao": "Reparação",
                            "outra": "Outra"
                        }
                    },
                    "unidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Unidade de preço",
                        "enum": [
                            "enxertos",
                            "sessoes",
                            "unidade",
                            "cm2",
                            "dentes"
                        ],
                        "x-enum-rotulos": {
                            "enxertos": "Enxertos",
                            "sessoes": "Sessões",
                            "unidade": "Unidade",
                            "cm2": "cm²",
                            "dentes": "Dentes"
                        },
                        "default": "unidade"
                    },
                    "preco_base": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Preço base",
                        "description": "Valor fixo do ato, com IVA incluído.",
                        "maximum": 1000000,
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "preco_unidade": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Preço por unidade",
                        "description": "Valor por enxerto, sessão ou unidade, quando não há tabela de preços.",
                        "maximum": 100000,
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "iva_taxa": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Taxa de IVA (%)",
                        "description": "Atos médicos com finalidade terapêutica estão normalmente isentos; atos estéticos podem não estar.",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2,
                        "default": 23
                    },
                    "iva_motivo_isencao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo de isenção",
                        "description": "Código do motivo (ex.: M07 — artigo 9.º do Código do IVA).",
                        "maxLength": 10,
                        "pattern": "^M[0-9]{2}$"
                    },
                    "iva_enquadramento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Enquadramento",
                        "description": "Nota interna sobre o enquadramento fiscal do ato.",
                        "maxLength": 255
                    },
                    "iva_validado": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Validado pelo contabilista",
                        "description": "Marque depois de o contabilista confirmar a taxa e o motivo.",
                        "default": 0
                    },
                    "iva_validado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Validado em",
                        "readOnly": true
                    },
                    "descricao_fatura": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição na fatura",
                        "description": "Denominação usual do serviço, sem diagnósticos nem dados clínicos.",
                        "maxLength": 190
                    },
                    "duracao_min": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Duração (minutos)",
                        "maximum": 1440,
                        "minimum": 0,
                        "x-unidade": "min"
                    },
                    "marcos": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "d1",
                                "s1",
                                "m1",
                                "m2",
                                "m6",
                                "m9",
                                "m12",
                                "m18"
                            ]
                        },
                        "title": "Marcos de acompanhamento",
                        "description": "Momentos de fotografias e consultas depois do procedimento.",
                        "x-enum-rotulos": {
                            "d1": "Dia 1",
                            "s1": "1.ª semana",
                            "m1": "1 mês",
                            "m2": "2 meses",
                            "m6": "6 meses",
                            "m9": "9 meses",
                            "m12": "12 meses",
                            "m18": "18 meses"
                        }
                    },
                    "consumos": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Consumos previstos",
                        "description": "Artigos de stock usados por omissão (para o custo interno e a margem)."
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 4000
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-clinico": false
            },
            "Recurso_procedimentos_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "nome_en": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome em inglês",
                        "description": "Usado nas propostas em inglês.",
                        "maxLength": 160
                    },
                    "codigo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Código",
                        "maxLength": 30,
                        "pattern": "^[A-Za-z0-9_\\-]{1,30}$"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "consulta",
                            "cirurgia",
                            "tratamento",
                            "exame",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "consulta": "Consulta",
                            "cirurgia": "Cirurgia",
                            "tratamento": "Tratamento",
                            "exame": "Exame",
                            "outro": "Outro"
                        },
                        "default": "cirurgia"
                    },
                    "tecnica": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Técnica",
                        "enum": [
                            "FUE",
                            "FUT",
                            "DHI",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "FUE": "FUE",
                            "FUT": "FUT",
                            "DHI": "Implantação com implantadores (DHI)",
                            "outra": "Outra"
                        }
                    },
                    "area": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Área",
                        "enum": [
                            "couro_cabeludo",
                            "barba",
                            "sobrancelhas",
                            "feminina",
                            "reparacao",
                            "outra"
                        ],
                        "x-enum-rotulos": {
                            "couro_cabeludo": "Couro cabeludo",
                            "barba": "Barba",
                            "sobrancelhas": "Sobrancelhas",
                            "feminina": "Capilar feminina",
                            "reparacao": "Reparação",
                            "outra": "Outra"
                        }
                    },
                    "unidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Unidade de preço",
                        "enum": [
                            "enxertos",
                            "sessoes",
                            "unidade",
                            "cm2",
                            "dentes"
                        ],
                        "x-enum-rotulos": {
                            "enxertos": "Enxertos",
                            "sessoes": "Sessões",
                            "unidade": "Unidade",
                            "cm2": "cm²",
                            "dentes": "Dentes"
                        },
                        "default": "unidade"
                    },
                    "preco_base": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Preço base",
                        "description": "Valor fixo do ato, com IVA incluído.",
                        "maximum": 1000000,
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "preco_unidade": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Preço por unidade",
                        "description": "Valor por enxerto, sessão ou unidade, quando não há tabela de preços.",
                        "maximum": 100000,
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 2
                    },
                    "iva_taxa": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Taxa de IVA (%)",
                        "description": "Atos médicos com finalidade terapêutica estão normalmente isentos; atos estéticos podem não estar.",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2,
                        "default": 23
                    },
                    "iva_motivo_isencao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo de isenção",
                        "description": "Código do motivo (ex.: M07 — artigo 9.º do Código do IVA).",
                        "maxLength": 10,
                        "pattern": "^M[0-9]{2}$"
                    },
                    "iva_enquadramento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Enquadramento",
                        "description": "Nota interna sobre o enquadramento fiscal do ato.",
                        "maxLength": 255
                    },
                    "iva_validado": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Validado pelo contabilista",
                        "description": "Marque depois de o contabilista confirmar a taxa e o motivo.",
                        "default": 0
                    },
                    "descricao_fatura": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição na fatura",
                        "description": "Denominação usual do serviço, sem diagnósticos nem dados clínicos.",
                        "maxLength": 190
                    },
                    "duracao_min": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Duração (minutos)",
                        "maximum": 1440,
                        "minimum": 0,
                        "x-unidade": "min"
                    },
                    "marcos": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "d1",
                                "s1",
                                "m1",
                                "m2",
                                "m6",
                                "m9",
                                "m12",
                                "m18"
                            ]
                        },
                        "title": "Marcos de acompanhamento",
                        "description": "Momentos de fotografias e consultas depois do procedimento.",
                        "x-enum-rotulos": {
                            "d1": "Dia 1",
                            "s1": "1.ª semana",
                            "m1": "1 mês",
                            "m2": "2 meses",
                            "m6": "6 meses",
                            "m9": "9 meses",
                            "m12": "12 meses",
                            "m18": "18 meses"
                        }
                    },
                    "consumos": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Consumos previstos",
                        "description": "Artigos de stock usados por omissão (para o custo interno e a margem)."
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 4000
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    }
                },
                "required": [
                    "nome",
                    "tipo",
                    "unidade",
                    "iva_taxa"
                ]
            },
            "Recurso_propostas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "numero": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Número",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes",
                        "readOnly": true
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Contacto",
                        "x-anagen-recurso": "leads",
                        "readOnly": true
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Episódio",
                        "readOnly": true
                    },
                    "procedimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Procedimento",
                        "x-anagen-recurso": "procedimentos",
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "rascunho",
                            "enviada",
                            "vista",
                            "aceite",
                            "recusada",
                            "expirada"
                        ],
                        "x-enum-rotulos": {
                            "rascunho": "Rascunho",
                            "enviada": "Enviada",
                            "vista": "Vista",
                            "aceite": "Aceite",
                            "recusada": "Recusada",
                            "expirada": "Expirada"
                        },
                        "readOnly": true
                    },
                    "total": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Total",
                        "x-moeda": "EUR",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "moeda": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Moeda",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "desconto_pct": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Desconto",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "desconto_estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Desconto",
                        "enum": [
                            "nao_aplicavel",
                            "pendente",
                            "aprovado",
                            "recusado"
                        ],
                        "x-enum-rotulos": {
                            "nao_aplicavel": "Sem desconto",
                            "pendente": "Por decidir",
                            "aprovado": "Aprovado",
                            "recusado": "Recusado"
                        },
                        "readOnly": true
                    },
                    "validade_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válida até",
                        "readOnly": true
                    },
                    "enviada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Enviada em",
                        "readOnly": true
                    },
                    "vista_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Vista em",
                        "readOnly": true
                    },
                    "aceite_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Aceite em",
                        "readOnly": true
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Responsável",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "plano_versao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Versão do plano",
                        "readOnly": true
                    },
                    "parametros_versao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Versão dos parâmetros",
                        "readOnly": true
                    },
                    "impressao_digital": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Impressão digital",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "motivo_recusa": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo da recusa",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "comercial.propostas",
                "x-anagen-clinico": false
            },
            "Recurso_propostas_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_protocolos_foto": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "marco": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Marco",
                        "enum": [
                            "consulta",
                            "pre_operatorio",
                            "dia0",
                            "controlo",
                            "portal"
                        ],
                        "x-enum-rotulos": {
                            "consulta": "Consulta",
                            "pre_operatorio": "Pré-operatório",
                            "dia0": "Dia 0",
                            "controlo": "Controlo",
                            "portal": "Envio pelo paciente"
                        }
                    },
                    "vistas": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Vistas",
                        "description": "Lista de vistas: [{\"chave\": \"topo\", \"nome\": \"Topo\", \"instrucoes\": \"…\", \"silhueta\": \"topo\"}]. Silhuetas: frontal, frontal_inclinada, topo, coroa, lateral_esq, lateral_dir, dadora."
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 2000
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 999,
                        "minimum": 0,
                        "default": 0
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-clinico": false
            },
            "Recurso_protocolos_foto_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "marco": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Marco",
                        "enum": [
                            "consulta",
                            "pre_operatorio",
                            "dia0",
                            "controlo",
                            "portal"
                        ],
                        "x-enum-rotulos": {
                            "consulta": "Consulta",
                            "pre_operatorio": "Pré-operatório",
                            "dia0": "Dia 0",
                            "controlo": "Controlo",
                            "portal": "Envio pelo paciente"
                        }
                    },
                    "vistas": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Vistas",
                        "description": "Lista de vistas: [{\"chave\": \"topo\", \"nome\": \"Topo\", \"instrucoes\": \"…\", \"silhueta\": \"topo\"}]. Silhuetas: frontal, frontal_inclinada, topo, coroa, lateral_esq, lateral_dir, dadora."
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 2000
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 999,
                        "minimum": 0,
                        "default": 0
                    }
                },
                "required": [
                    "nome",
                    "marco",
                    "vistas"
                ]
            },
            "Recurso_publicos_anuncios": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "segmento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Segmento",
                        "x-anagen-recurso": "segmentos"
                    },
                    "plataforma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Destino",
                        "enum": [
                            "meta",
                            "google",
                            "ficheiro"
                        ],
                        "x-enum-rotulos": {
                            "meta": "Meta — público personalizado",
                            "google": "Google — lista de clientes",
                            "ficheiro": "Só ficheiro"
                        },
                        "default": "meta"
                    },
                    "destino_id": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Identificador do público na plataforma",
                        "description": "Meta: identificador do público personalizado. Google: identificador da lista de clientes.",
                        "maxLength": 120
                    },
                    "automatico": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Atualizar todos os dias",
                        "description": "Reenvia uma vez por dia (entra quem consentiu, sai quem se opôs).",
                        "default": 0
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "por_enviar",
                            "enviado",
                            "falhou",
                            "exportado"
                        ],
                        "x-enum-rotulos": {
                            "por_enviar": "Por enviar",
                            "enviado": "Enviado",
                            "falhou": "Falhou",
                            "exportado": "Exportado"
                        },
                        "readOnly": true
                    },
                    "enviados": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Pessoas",
                        "readOnly": true
                    },
                    "removidos": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Retiradas",
                        "readOnly": true
                    },
                    "excluidos": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "De fora",
                        "description": "Sem consentimento explícito, na lista de oposição ou sem contacto.",
                        "readOnly": true
                    },
                    "resultado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Último erro",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "ultima_sincronizacao_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Última vez",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-clinico": false
            },
            "Recurso_publicos_anuncios_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "segmento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Segmento",
                        "x-anagen-recurso": "segmentos"
                    },
                    "plataforma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Destino",
                        "enum": [
                            "meta",
                            "google",
                            "ficheiro"
                        ],
                        "x-enum-rotulos": {
                            "meta": "Meta — público personalizado",
                            "google": "Google — lista de clientes",
                            "ficheiro": "Só ficheiro"
                        },
                        "default": "meta"
                    },
                    "destino_id": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Identificador do público na plataforma",
                        "description": "Meta: identificador do público personalizado. Google: identificador da lista de clientes.",
                        "maxLength": 120
                    },
                    "automatico": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Atualizar todos os dias",
                        "description": "Reenvia uma vez por dia (entra quem consentiu, sai quem se opôs).",
                        "default": 0
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    }
                },
                "required": [
                    "nome",
                    "segmento_id",
                    "plataforma"
                ]
            },
            "Recurso_reclamacoes": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "numero": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Número",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "reclamacao",
                            "elogio",
                            "sugestao"
                        ],
                        "x-enum-rotulos": {
                            "reclamacao": "Reclamação",
                            "elogio": "Elogio",
                            "sugestao": "Sugestão"
                        },
                        "default": "reclamacao"
                    },
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal",
                        "enum": [
                            "fisico",
                            "eletronico",
                            "email",
                            "portal",
                            "telefone"
                        ],
                        "x-enum-rotulos": {
                            "fisico": "Livro físico",
                            "eletronico": "Livro eletrónico",
                            "email": "Email",
                            "portal": "Portal do paciente",
                            "telefone": "Telefone"
                        },
                        "default": "eletronico"
                    },
                    "livro_referencia": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Referência do Livro",
                        "description": "Número da folha do livro físico ou referência do Livro de Reclamações Eletrónico.",
                        "maxLength": 60
                    },
                    "categoria": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Categoria",
                        "enum": [
                            "atendimento",
                            "tempo_espera",
                            "cuidados_clinicos",
                            "resultado",
                            "faturacao",
                            "instalacoes",
                            "privacidade",
                            "comunicacao",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "atendimento": "Atendimento",
                            "tempo_espera": "Tempo de espera",
                            "cuidados_clinicos": "Cuidados clínicos",
                            "resultado": "Resultado",
                            "faturacao": "Faturação",
                            "instalacoes": "Instalações",
                            "privacidade": "Privacidade",
                            "comunicacao": "Comunicação",
                            "outro": "Outro"
                        }
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "nome_reclamante": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "contacto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Contacto",
                        "maxLength": 190,
                        "x-anagen-cifrado": "geral"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 10000,
                        "x-anagen-cifrado": "geral"
                    },
                    "recebida_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Recebida em"
                    },
                    "prazo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Prazo",
                        "description": "Calculado em dias úteis a partir da receção (Definições).",
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "recebida",
                            "em_tratamento",
                            "respondida",
                            "encerrada"
                        ],
                        "x-enum-rotulos": {
                            "recebida": "Recebida",
                            "em_tratamento": "Em tratamento",
                            "respondida": "Respondida",
                            "encerrada": "Encerrada"
                        },
                        "readOnly": true
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Responsável",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "resposta": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resposta",
                        "maxLength": 10000,
                        "x-anagen-cifrado": "geral",
                        "readOnly": true
                    },
                    "respondida_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Respondida em",
                        "readOnly": true
                    },
                    "exportada_ers_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Exportada para a ERS em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-clinico": false
            },
            "Recurso_reclamacoes_Entrada": {
                "type": "object",
                "properties": {
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "reclamacao",
                            "elogio",
                            "sugestao"
                        ],
                        "x-enum-rotulos": {
                            "reclamacao": "Reclamação",
                            "elogio": "Elogio",
                            "sugestao": "Sugestão"
                        },
                        "default": "reclamacao"
                    },
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal",
                        "enum": [
                            "fisico",
                            "eletronico",
                            "email",
                            "portal",
                            "telefone"
                        ],
                        "x-enum-rotulos": {
                            "fisico": "Livro físico",
                            "eletronico": "Livro eletrónico",
                            "email": "Email",
                            "portal": "Portal do paciente",
                            "telefone": "Telefone"
                        },
                        "default": "eletronico"
                    },
                    "livro_referencia": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Referência do Livro",
                        "description": "Número da folha do livro físico ou referência do Livro de Reclamações Eletrónico.",
                        "maxLength": 60
                    },
                    "categoria": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Categoria",
                        "enum": [
                            "atendimento",
                            "tempo_espera",
                            "cuidados_clinicos",
                            "resultado",
                            "faturacao",
                            "instalacoes",
                            "privacidade",
                            "comunicacao",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "atendimento": "Atendimento",
                            "tempo_espera": "Tempo de espera",
                            "cuidados_clinicos": "Cuidados clínicos",
                            "resultado": "Resultado",
                            "faturacao": "Faturação",
                            "instalacoes": "Instalações",
                            "privacidade": "Privacidade",
                            "comunicacao": "Comunicação",
                            "outro": "Outro"
                        }
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "nome_reclamante": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "contacto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Contacto",
                        "maxLength": 190,
                        "x-anagen-cifrado": "geral"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 10000,
                        "x-anagen-cifrado": "geral"
                    },
                    "recebida_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Recebida em"
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Responsável",
                        "x-anagen-recurso": "utilizadores"
                    }
                },
                "required": [
                    "tipo",
                    "canal",
                    "descricao"
                ]
            },
            "Recurso_recursos_agenda": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "sala",
                            "equipamento",
                            "interprete"
                        ],
                        "x-enum-rotulos": {
                            "sala": "Sala",
                            "equipamento": "Equipamento",
                            "interprete": "Intérprete"
                        },
                        "default": "sala"
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9a-fA-F]{6}$",
                        "title": "Cor",
                        "description": "Cor da coluna na agenda e no mapa de cirurgias."
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Idioma",
                        "enum": [
                            "pt-PT",
                            "en",
                            "es",
                            "fr",
                            "de",
                            "it",
                            "ar",
                            "ru",
                            "zh",
                            "nl"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão",
                            "it": "Italiano",
                            "ar": "Árabe",
                            "ru": "Russo",
                            "zh": "Chinês",
                            "nl": "Neerlandês"
                        }
                    },
                    "capacidade": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Capacidade",
                        "description": "Marcações em simultâneo (1 para salas e equipamentos únicos).",
                        "maximum": 20,
                        "minimum": 1,
                        "default": 1
                    },
                    "bloco": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Sala operatória",
                        "description": "Aparece como coluna no mapa de cirurgias."
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 255
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 999,
                        "minimum": 0,
                        "default": 0
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "agenda",
                "x-anagen-clinico": false
            },
            "Recurso_recursos_agenda_Entrada": {
                "type": "object",
                "properties": {
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "sala",
                            "equipamento",
                            "interprete"
                        ],
                        "x-enum-rotulos": {
                            "sala": "Sala",
                            "equipamento": "Equipamento",
                            "interprete": "Intérprete"
                        },
                        "default": "sala"
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9a-fA-F]{6}$",
                        "title": "Cor",
                        "description": "Cor da coluna na agenda e no mapa de cirurgias."
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Idioma",
                        "enum": [
                            "pt-PT",
                            "en",
                            "es",
                            "fr",
                            "de",
                            "it",
                            "ar",
                            "ru",
                            "zh",
                            "nl"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão",
                            "it": "Italiano",
                            "ar": "Árabe",
                            "ru": "Russo",
                            "zh": "Chinês",
                            "nl": "Neerlandês"
                        }
                    },
                    "capacidade": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Capacidade",
                        "description": "Marcações em simultâneo (1 para salas e equipamentos únicos).",
                        "maximum": 20,
                        "minimum": 1,
                        "default": 1
                    },
                    "bloco": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Sala operatória",
                        "description": "Aparece como coluna no mapa de cirurgias."
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 255
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 999,
                        "minimum": 0,
                        "default": 0
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    }
                },
                "required": [
                    "tipo",
                    "nome"
                ]
            },
            "Recurso_regras_elegibilidade": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "nivel": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nível",
                        "enum": [
                            "alerta",
                            "bloqueio"
                        ],
                        "x-enum-rotulos": {
                            "alerta": "Alerta",
                            "bloqueio": "Bloqueio"
                        }
                    },
                    "mensagem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Mensagem",
                        "description": "Texto mostrado ao médico quando a regra se aplica.",
                        "maxLength": 400
                    },
                    "condicao": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Condição",
                        "description": "Condição avaliada sobre os dados da consulta, por exemplo {\"campo\": \"idade\", \"operador\": \"<\", \"valor\": 21}. Combine várias com {\"todas\": […]} ou {\"alguma\": […]}."
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 10000,
                        "minimum": 0,
                        "default": 100
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "rascunho",
                            "aprovada",
                            "arquivada"
                        ],
                        "x-enum-rotulos": {
                            "rascunho": "Rascunho",
                            "aprovada": "Aprovada",
                            "arquivada": "Arquivada"
                        },
                        "readOnly": true
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "readOnly": true
                    },
                    "versao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Versão",
                        "readOnly": true
                    },
                    "aprovado_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Aprovada por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "aprovado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Aprovada em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "clinico.parametros",
                "x-anagen-clinico": false
            },
            "Recurso_regras_elegibilidade_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "nivel": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nível",
                        "enum": [
                            "alerta",
                            "bloqueio"
                        ],
                        "x-enum-rotulos": {
                            "alerta": "Alerta",
                            "bloqueio": "Bloqueio"
                        }
                    },
                    "mensagem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Mensagem",
                        "description": "Texto mostrado ao médico quando a regra se aplica.",
                        "maxLength": 400
                    },
                    "condicao": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Condição",
                        "description": "Condição avaliada sobre os dados da consulta, por exemplo {\"campo\": \"idade\", \"operador\": \"<\", \"valor\": 21}. Combine várias com {\"todas\": […]} ou {\"alguma\": […]}."
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 10000,
                        "minimum": 0,
                        "default": 100
                    }
                },
                "required": [
                    "nome",
                    "nivel",
                    "mensagem",
                    "condicao"
                ]
            },
            "Recurso_relatorios_agendados": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "indicadores": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "financeiros.faturacao",
                                "financeiros.valor_cirurgia",
                                "financeiros.margem",
                                "financeiros.comissoes",
                                "financeiros.sinais_divida",
                                "financeiros.receita_prevista",
                                "financeiros.cancelamentos",
                                "financeiros.consumiveis",
                                "financeiros.tempo_pagamento",
                                "vendas.leads_origem",
                                "vendas.primeiro_contacto",
                                "vendas.conversao",
                                "vendas.propostas",
                                "vendas.ciclo_venda",
                                "vendas.aquisicao",
                                "vendas.desempenho",
                                "vendas.email_marketing",
                                "vendas.telemarketing",
                                "vendas.motivos_perda",
                                "vendas.decisao",
                                "vendas.tempo_fases",
                                "operacionais.cirurgias",
                                "operacionais.enxertos",
                                "operacionais.planeado",
                                "operacionais.fases",
                                "operacionais.faltas",
                                "operacionais.espera",
                                "operacionais.acompanhamento",
                                "operacionais.complicacoes",
                                "operacionais.material",
                                "operacionais.coortes",
                                "operacionais.validacoes",
                                "atendimento.tempo_resposta",
                                "atendimento.confirmacao",
                                "atendimento.satisfacao",
                                "atendimento.resultado",
                                "atendimento.reclamacoes",
                                "atendimento.agente",
                                "atendimento.complementares"
                            ]
                        },
                        "title": "Indicadores",
                        "x-enum-rotulos": {
                            "financeiros.faturacao": "Financeiros · Faturação",
                            "financeiros.valor_cirurgia": "Financeiros · Valor por cirurgia e por enxerto",
                            "financeiros.margem": "Financeiros · Margem por cirurgia",
                            "financeiros.comissoes": "Financeiros · Comissões e honorários",
                            "financeiros.sinais_divida": "Financeiros · Sinais e valores em dívida",
                            "financeiros.receita_prevista": "Financeiros · Receita prevista",
                            "financeiros.cancelamentos": "Financeiros · Cancelamentos e reembolsos",
                            "financeiros.consumiveis": "Financeiros · Custo de consumíveis",
                            "financeiros.tempo_pagamento": "Financeiros · Tempo até ao pagamento",
                            "vendas.leads_origem": "Vendas e marketing · Leads por origem",
                            "vendas.primeiro_contacto": "Vendas e marketing · Primeiro contacto",
                            "vendas.conversao": "Vendas e marketing · Conversão",
                            "vendas.propostas": "Vendas e marketing · Propostas",
                            "vendas.ciclo_venda": "Vendas e marketing · Ciclo de venda",
                            "vendas.aquisicao": "Vendas e marketing · Custo de aquisição e retorno",
                            "vendas.desempenho": "Vendas e marketing · Desempenho por pessoa",
                            "vendas.email_marketing": "Vendas e marketing · Email marketing",
                            "vendas.telemarketing": "Vendas e marketing · Telemarketing",
                            "vendas.motivos_perda": "Vendas e marketing · Motivos de perda",
                            "vendas.decisao": "Vendas e marketing · Painel de decisão",
                            "vendas.tempo_fases": "Vendas e marketing · Tempo em cada fase",
                            "operacionais.cirurgias": "Operacionais e produção · Cirurgias e ocupação",
                            "operacionais.enxertos": "Operacionais e produção · Enxertos",
                            "operacionais.planeado": "Operacionais e produção · Planeado face a realizado",
                            "operacionais.fases": "Operacionais e produção · Fases e equipa",
                            "operacionais.faltas": "Operacionais e produção · Faltas e cancelamentos",
                            "operacionais.espera": "Operacionais e produção · Tempos de espera",
                            "operacionais.acompanhamento": "Operacionais e produção · Cumprimento do acompanhamento",
                            "operacionais.complicacoes": "Operacionais e produção · Complicações e ocorrências",
                            "operacionais.material": "Operacionais e produção · Material e stock",
                            "operacionais.coortes": "Operacionais e produção · Coortes de resultados",
                            "operacionais.validacoes": "Operacionais e produção · Validações em atraso",
                            "atendimento.tempo_resposta": "Atendimento e clientes · Tempo de resposta",
                            "atendimento.confirmacao": "Atendimento e clientes · Confirmação de presença",
                            "atendimento.satisfacao": "Atendimento e clientes · Satisfação e recomendação",
                            "atendimento.resultado": "Atendimento e clientes · Resultado percebido",
                            "atendimento.reclamacoes": "Atendimento e clientes · Reclamações",
                            "atendimento.agente": "Atendimento e clientes · Assistente de voz",
                            "atendimento.complementares": "Atendimento e clientes · Complementares e recomendação"
                        }
                    },
                    "periodicidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Periodicidade",
                        "enum": [
                            "diaria",
                            "semanal",
                            "mensal"
                        ],
                        "x-enum-rotulos": {
                            "diaria": "Diária",
                            "semanal": "Semanal (segunda-feira)",
                            "mensal": "Mensal (dia 1)"
                        },
                        "default": "semanal"
                    },
                    "hora_envio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{2}:\\d{2}$",
                        "title": "Hora do envio",
                        "default": "08:00"
                    },
                    "destinatarios": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "title": "Destinatários",
                        "description": "Cada pessoa recebe só os indicadores que pode consultar.",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "filtros": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Filtros",
                        "description": "Opcional, em JSON. Ex.: {\"origem\": \"meta\", \"procedimento_id\": 3}."
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "proximo_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Próximo envio",
                        "readOnly": true
                    },
                    "ultimo_envio_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Último envio",
                        "readOnly": true
                    },
                    "ultimo_resultado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resultado do último envio",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-clinico": false
            },
            "Recurso_relatorios_agendados_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "indicadores": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "financeiros.faturacao",
                                "financeiros.valor_cirurgia",
                                "financeiros.margem",
                                "financeiros.comissoes",
                                "financeiros.sinais_divida",
                                "financeiros.receita_prevista",
                                "financeiros.cancelamentos",
                                "financeiros.consumiveis",
                                "financeiros.tempo_pagamento",
                                "vendas.leads_origem",
                                "vendas.primeiro_contacto",
                                "vendas.conversao",
                                "vendas.propostas",
                                "vendas.ciclo_venda",
                                "vendas.aquisicao",
                                "vendas.desempenho",
                                "vendas.email_marketing",
                                "vendas.telemarketing",
                                "vendas.motivos_perda",
                                "vendas.decisao",
                                "vendas.tempo_fases",
                                "operacionais.cirurgias",
                                "operacionais.enxertos",
                                "operacionais.planeado",
                                "operacionais.fases",
                                "operacionais.faltas",
                                "operacionais.espera",
                                "operacionais.acompanhamento",
                                "operacionais.complicacoes",
                                "operacionais.material",
                                "operacionais.coortes",
                                "operacionais.validacoes",
                                "atendimento.tempo_resposta",
                                "atendimento.confirmacao",
                                "atendimento.satisfacao",
                                "atendimento.resultado",
                                "atendimento.reclamacoes",
                                "atendimento.agente",
                                "atendimento.complementares"
                            ]
                        },
                        "title": "Indicadores",
                        "x-enum-rotulos": {
                            "financeiros.faturacao": "Financeiros · Faturação",
                            "financeiros.valor_cirurgia": "Financeiros · Valor por cirurgia e por enxerto",
                            "financeiros.margem": "Financeiros · Margem por cirurgia",
                            "financeiros.comissoes": "Financeiros · Comissões e honorários",
                            "financeiros.sinais_divida": "Financeiros · Sinais e valores em dívida",
                            "financeiros.receita_prevista": "Financeiros · Receita prevista",
                            "financeiros.cancelamentos": "Financeiros · Cancelamentos e reembolsos",
                            "financeiros.consumiveis": "Financeiros · Custo de consumíveis",
                            "financeiros.tempo_pagamento": "Financeiros · Tempo até ao pagamento",
                            "vendas.leads_origem": "Vendas e marketing · Leads por origem",
                            "vendas.primeiro_contacto": "Vendas e marketing · Primeiro contacto",
                            "vendas.conversao": "Vendas e marketing · Conversão",
                            "vendas.propostas": "Vendas e marketing · Propostas",
                            "vendas.ciclo_venda": "Vendas e marketing · Ciclo de venda",
                            "vendas.aquisicao": "Vendas e marketing · Custo de aquisição e retorno",
                            "vendas.desempenho": "Vendas e marketing · Desempenho por pessoa",
                            "vendas.email_marketing": "Vendas e marketing · Email marketing",
                            "vendas.telemarketing": "Vendas e marketing · Telemarketing",
                            "vendas.motivos_perda": "Vendas e marketing · Motivos de perda",
                            "vendas.decisao": "Vendas e marketing · Painel de decisão",
                            "vendas.tempo_fases": "Vendas e marketing · Tempo em cada fase",
                            "operacionais.cirurgias": "Operacionais e produção · Cirurgias e ocupação",
                            "operacionais.enxertos": "Operacionais e produção · Enxertos",
                            "operacionais.planeado": "Operacionais e produção · Planeado face a realizado",
                            "operacionais.fases": "Operacionais e produção · Fases e equipa",
                            "operacionais.faltas": "Operacionais e produção · Faltas e cancelamentos",
                            "operacionais.espera": "Operacionais e produção · Tempos de espera",
                            "operacionais.acompanhamento": "Operacionais e produção · Cumprimento do acompanhamento",
                            "operacionais.complicacoes": "Operacionais e produção · Complicações e ocorrências",
                            "operacionais.material": "Operacionais e produção · Material e stock",
                            "operacionais.coortes": "Operacionais e produção · Coortes de resultados",
                            "operacionais.validacoes": "Operacionais e produção · Validações em atraso",
                            "atendimento.tempo_resposta": "Atendimento e clientes · Tempo de resposta",
                            "atendimento.confirmacao": "Atendimento e clientes · Confirmação de presença",
                            "atendimento.satisfacao": "Atendimento e clientes · Satisfação e recomendação",
                            "atendimento.resultado": "Atendimento e clientes · Resultado percebido",
                            "atendimento.reclamacoes": "Atendimento e clientes · Reclamações",
                            "atendimento.agente": "Atendimento e clientes · Assistente de voz",
                            "atendimento.complementares": "Atendimento e clientes · Complementares e recomendação"
                        }
                    },
                    "periodicidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Periodicidade",
                        "enum": [
                            "diaria",
                            "semanal",
                            "mensal"
                        ],
                        "x-enum-rotulos": {
                            "diaria": "Diária",
                            "semanal": "Semanal (segunda-feira)",
                            "mensal": "Mensal (dia 1)"
                        },
                        "default": "semanal"
                    },
                    "hora_envio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^\\d{2}:\\d{2}$",
                        "title": "Hora do envio",
                        "default": "08:00"
                    },
                    "destinatarios": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "title": "Destinatários",
                        "description": "Cada pessoa recebe só os indicadores que pode consultar.",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "filtros": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Filtros",
                        "description": "Opcional, em JSON. Ex.: {\"origem\": \"meta\", \"procedimento_id\": 3}."
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    }
                },
                "required": [
                    "nome",
                    "indicadores",
                    "destinatarios"
                ]
            },
            "Recurso_respostas_rapidas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 120
                    },
                    "atalho": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Atalho",
                        "description": "Ex.: /horario — escreva-o na mensagem para inserir o texto.",
                        "maxLength": 30
                    },
                    "corpo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Texto",
                        "description": "Sem promoções nem pormenores clínicos.",
                        "maxLength": 4000
                    },
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal",
                        "description": "Vazio: todos os canais.",
                        "enum": [
                            "portal",
                            "whatsapp",
                            "instagram",
                            "messenger",
                            "email",
                            "chat_site",
                            "sms"
                        ],
                        "x-enum-rotulos": {
                            "portal": "Portal",
                            "whatsapp": "WhatsApp",
                            "instagram": "Instagram",
                            "messenger": "Messenger",
                            "email": "Email",
                            "chat_site": "Chat do site",
                            "sms": "SMS"
                        }
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        },
                        "default": "pt-PT"
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "crm.atendimento",
                "x-anagen-clinico": false
            },
            "Recurso_respostas_rapidas_Entrada": {
                "type": "object",
                "properties": {
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 120
                    },
                    "atalho": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Atalho",
                        "description": "Ex.: /horario — escreva-o na mensagem para inserir o texto.",
                        "maxLength": 30
                    },
                    "corpo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Texto",
                        "description": "Sem promoções nem pormenores clínicos.",
                        "maxLength": 4000
                    },
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal",
                        "description": "Vazio: todos os canais.",
                        "enum": [
                            "portal",
                            "whatsapp",
                            "instagram",
                            "messenger",
                            "email",
                            "chat_site",
                            "sms"
                        ],
                        "x-enum-rotulos": {
                            "portal": "Portal",
                            "whatsapp": "WhatsApp",
                            "instagram": "Instagram",
                            "messenger": "Messenger",
                            "email": "Email",
                            "chat_site": "Chat do site",
                            "sms": "SMS"
                        }
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        },
                        "default": "pt-PT"
                    }
                },
                "required": [
                    "titulo",
                    "corpo"
                ]
            },
            "Recurso_reunioes": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 200
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Início"
                    },
                    "fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Fim"
                    },
                    "participantes": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "title": "Participantes",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "canal_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Canal"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Ordem de trabalhos",
                        "maxLength": 4000
                    },
                    "criar_sala": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Criar sala de vídeo",
                        "description": "Usa o serviço de vídeo configurado pela clínica.",
                        "default": 1
                    },
                    "sala_url": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "uri",
                        "title": "Endereço da sala",
                        "description": "Preenchido automaticamente; também pode colar um endereço https://.",
                        "maxLength": 500
                    },
                    "gravada": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Gravar a reunião",
                        "default": 0
                    },
                    "transcrita": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Transcrever a reunião",
                        "default": 0
                    },
                    "aviso_confirmado": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Confirmo que todos os participantes são avisados da gravação/transcrição",
                        "description": "Obrigatório para gravar ou transcrever. O aviso segue na notificação e no canal."
                    },
                    "aviso_gravacao_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Aviso de gravação dado em",
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "agendada",
                            "em_curso",
                            "terminada",
                            "cancelada"
                        ],
                        "x-enum-rotulos": {
                            "agendada": "Agendada",
                            "em_curso": "A decorrer",
                            "terminada": "Terminada",
                            "cancelada": "Cancelada"
                        },
                        "readOnly": true,
                        "default": "agendada"
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "description": "Notas internas, guardadas cifradas. Não escreva dados clínicos.",
                        "maxLength": 20000,
                        "x-anagen-cifrado": "geral"
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "equipa.chat",
                "x-anagen-clinico": false
            },
            "Recurso_reunioes_Entrada": {
                "type": "object",
                "properties": {
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 200
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Início"
                    },
                    "fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Fim"
                    },
                    "participantes": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "title": "Participantes",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "canal_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Canal"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Ordem de trabalhos",
                        "maxLength": 4000
                    },
                    "criar_sala": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Criar sala de vídeo",
                        "description": "Usa o serviço de vídeo configurado pela clínica.",
                        "default": 1
                    },
                    "sala_url": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "uri",
                        "title": "Endereço da sala",
                        "description": "Preenchido automaticamente; também pode colar um endereço https://.",
                        "maxLength": 500
                    },
                    "gravada": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Gravar a reunião",
                        "default": 0
                    },
                    "transcrita": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Transcrever a reunião",
                        "default": 0
                    },
                    "aviso_confirmado": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Confirmo que todos os participantes são avisados da gravação/transcrição",
                        "description": "Obrigatório para gravar ou transcrever. O aviso segue na notificação e no canal."
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "description": "Notas internas, guardadas cifradas. Não escreva dados clínicos.",
                        "maxLength": 20000,
                        "x-anagen-cifrado": "geral"
                    }
                },
                "required": [
                    "titulo",
                    "inicio"
                ]
            },
            "Recurso_revisoes_acessos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "periodo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Trimestre",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "em_curso",
                            "concluida"
                        ],
                        "x-enum-rotulos": {
                            "em_curso": "Em curso",
                            "concluida": "Concluída"
                        },
                        "readOnly": true
                    },
                    "iniciada_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Iniciada em",
                        "readOnly": true
                    },
                    "utilizadores_n": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Pessoas",
                        "x-unidade": "pessoas",
                        "readOnly": true
                    },
                    "sensiveis_n": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Com acesso clínico",
                        "x-unidade": "pessoas",
                        "readOnly": true
                    },
                    "revisto_por": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Concluída por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "revisto_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Concluída em",
                        "readOnly": true
                    },
                    "alteracoes": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Alterações feitas",
                        "readOnly": true
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-clinico": false
            },
            "Recurso_revisoes_acessos_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_segmentos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 255
                    },
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal",
                        "enum": [
                            "email",
                            "sms",
                            "whatsapp"
                        ],
                        "x-enum-rotulos": {
                            "email": "Email",
                            "sms": "SMS",
                            "whatsapp": "WhatsApp"
                        },
                        "default": "email"
                    },
                    "regras": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Regras",
                        "description": "{\"publico\": \"leads|pacientes|ambos\", \"condicoes\": [{\"campo\": \"fase_id|origem|idioma|decisao|pontuacao_min|criado_desde|criado_ate|cliente|ultima_visita_dias_min|ultima_visita_dias_max|procedimento_id\", \"valor\": …}]}"
                    },
                    "usa_dados_clinicos": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Usa dados clínicos",
                        "description": "Segmentar por procedimento exige consentimento explícito de cada contacto.",
                        "readOnly": true
                    },
                    "contagem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Podem receber",
                        "readOnly": true
                    },
                    "contagem_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Contado em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "marketing",
                "x-anagen-clinico": false
            },
            "Recurso_segmentos_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 255
                    },
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal",
                        "enum": [
                            "email",
                            "sms",
                            "whatsapp"
                        ],
                        "x-enum-rotulos": {
                            "email": "Email",
                            "sms": "SMS",
                            "whatsapp": "WhatsApp"
                        },
                        "default": "email"
                    },
                    "regras": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Regras",
                        "description": "{\"publico\": \"leads|pacientes|ambos\", \"condicoes\": [{\"campo\": \"fase_id|origem|idioma|decisao|pontuacao_min|criado_desde|criado_ate|cliente|ultima_visita_dias_min|ultima_visita_dias_max|procedimento_id\", \"valor\": …}]}"
                    }
                },
                "required": [
                    "nome",
                    "regras"
                ]
            },
            "Recurso_sequencias": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "gatilho": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Começa quando",
                        "enum": [
                            "lead_criado",
                            "fase",
                            "manual"
                        ],
                        "x-enum-rotulos": {
                            "lead_criado": "Lead criado",
                            "fase": "Entrada numa fase",
                            "manual": "Manual"
                        },
                        "default": "lead_criado"
                    },
                    "fase_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Fase",
                        "x-anagen-recurso": "funil_fases"
                    },
                    "passos": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Passos",
                        "description": "Lista de {\"dia\", \"canal\": email|sms|whatsapp|tarefa, \"finalidade\": servico|marketing, \"assunto\", \"corpo\", \"tarefa\"}. {nome} e {clinica} são substituídos."
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    },
                    "parar_ao_responder": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Parar quando o contacto responde",
                        "default": 1
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "crm.leads",
                "x-anagen-clinico": false
            },
            "Recurso_sequencias_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "gatilho": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Começa quando",
                        "enum": [
                            "lead_criado",
                            "fase",
                            "manual"
                        ],
                        "x-enum-rotulos": {
                            "lead_criado": "Lead criado",
                            "fase": "Entrada numa fase",
                            "manual": "Manual"
                        },
                        "default": "lead_criado"
                    },
                    "fase_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Fase",
                        "x-anagen-recurso": "funil_fases"
                    },
                    "passos": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Passos",
                        "description": "Lista de {\"dia\", \"canal\": email|sms|whatsapp|tarefa, \"finalidade\": servico|marketing, \"assunto\", \"corpo\", \"tarefa\"}. {nome} e {clinica} são substituídos."
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    },
                    "parar_ao_responder": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Parar quando o contacto responde",
                        "default": 1
                    }
                },
                "required": [
                    "nome",
                    "gatilho",
                    "passos"
                ]
            },
            "Recurso_stock_movimentos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "artigo_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Artigo",
                        "x-anagen-recurso": "artigos"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "entrada",
                            "saida",
                            "ajuste",
                            "consumo",
                            "devolucao"
                        ],
                        "x-enum-rotulos": {
                            "entrada": "Entrada",
                            "saida": "Saída",
                            "ajuste": "Ajuste",
                            "consumo": "Consumo em cirurgia",
                            "devolucao": "Devolução"
                        }
                    },
                    "quantidade": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Quantidade",
                        "description": "Positiva para entradas; nos ajustes, negativa para retirar.",
                        "x-casas": 3
                    },
                    "lote": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Lote",
                        "maxLength": 60
                    },
                    "validade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Validade"
                    },
                    "custo": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Custo unitário",
                        "description": "Nas entradas, atualiza o custo médio do artigo.",
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 4
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "cirurgia_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Cirurgia",
                        "readOnly": true
                    },
                    "encomenda_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Encomenda",
                        "x-anagen-recurso": "encomendas",
                        "readOnly": true
                    },
                    "saldo_apos": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Saldo após",
                        "x-casas": 3,
                        "readOnly": true
                    },
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Registado por",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 500
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "stock",
                "x-anagen-clinico": false
            },
            "Recurso_stock_movimentos_Entrada": {
                "type": "object",
                "properties": {
                    "artigo_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Artigo",
                        "x-anagen-recurso": "artigos"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "entrada",
                            "saida",
                            "ajuste",
                            "consumo",
                            "devolucao"
                        ],
                        "x-enum-rotulos": {
                            "entrada": "Entrada",
                            "saida": "Saída",
                            "ajuste": "Ajuste",
                            "consumo": "Consumo em cirurgia",
                            "devolucao": "Devolução"
                        }
                    },
                    "quantidade": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Quantidade",
                        "description": "Positiva para entradas; nos ajustes, negativa para retirar.",
                        "x-casas": 3
                    },
                    "lote": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Lote",
                        "maxLength": 60
                    },
                    "validade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Validade"
                    },
                    "custo": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Custo unitário",
                        "description": "Nas entradas, atualiza o custo médio do artigo.",
                        "minimum": 0,
                        "x-moeda": "EUR",
                        "x-casas": 4
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 500
                    }
                },
                "required": [
                    "artigo_id",
                    "tipo",
                    "quantidade"
                ]
            },
            "Recurso_subcontratantes": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "finalidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Finalidade",
                        "maxLength": 500
                    },
                    "pais": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "País",
                        "maxLength": 60
                    },
                    "categorias_dados": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "identificacao",
                                "contacto",
                                "saude",
                                "imagens",
                                "modelos_3d",
                                "gravacoes",
                                "financeiros",
                                "comportamento_site",
                                "profissionais"
                            ]
                        },
                        "title": "Categorias de dados",
                        "x-enum-rotulos": {
                            "identificacao": "Identificação",
                            "contacto": "Contactos",
                            "saude": "Dados de saúde",
                            "imagens": "Fotografias e imagens",
                            "modelos_3d": "Modelos 3D",
                            "gravacoes": "Gravações de voz e vídeo",
                            "financeiros": "Dados financeiros",
                            "comportamento_site": "Navegação no site",
                            "profissionais": "Dados de profissionais"
                        }
                    },
                    "contrato_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Contrato até"
                    },
                    "dpa_assinado": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Acordo de tratamento assinado",
                        "description": "Contrato com as cláusulas do art. 28.º do RGPD."
                    },
                    "sistema_ia": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Sistema de inteligência artificial"
                    },
                    "sem_treino": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Garantia de não treino",
                        "description": "O fornecedor garante por contrato que não usa os dados da clínica para treinar modelos.",
                        "default": 1
                    },
                    "transferencia_internacional": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Transferência para fora do EEE"
                    },
                    "garantias": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Garantias",
                        "description": "Certificações, medidas técnicas e organizativas, localização dos dados.",
                        "maxLength": 255
                    },
                    "contacto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Contacto",
                        "maxLength": 190
                    },
                    "website": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "uri",
                        "title": "Site"
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "revisao_juridica": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Revisto pelo encarregado/jurídico",
                        "description": "Marque depois de o encarregado de proteção de dados ou o jurídico rever o texto. Os textos fornecidos com o sistema chegam por rever."
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 5000
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-clinico": false
            },
            "Recurso_subcontratantes_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "finalidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Finalidade",
                        "maxLength": 500
                    },
                    "pais": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "País",
                        "maxLength": 60
                    },
                    "categorias_dados": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "identificacao",
                                "contacto",
                                "saude",
                                "imagens",
                                "modelos_3d",
                                "gravacoes",
                                "financeiros",
                                "comportamento_site",
                                "profissionais"
                            ]
                        },
                        "title": "Categorias de dados",
                        "x-enum-rotulos": {
                            "identificacao": "Identificação",
                            "contacto": "Contactos",
                            "saude": "Dados de saúde",
                            "imagens": "Fotografias e imagens",
                            "modelos_3d": "Modelos 3D",
                            "gravacoes": "Gravações de voz e vídeo",
                            "financeiros": "Dados financeiros",
                            "comportamento_site": "Navegação no site",
                            "profissionais": "Dados de profissionais"
                        }
                    },
                    "contrato_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Contrato até"
                    },
                    "dpa_assinado": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Acordo de tratamento assinado",
                        "description": "Contrato com as cláusulas do art. 28.º do RGPD."
                    },
                    "sistema_ia": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Sistema de inteligência artificial"
                    },
                    "sem_treino": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Garantia de não treino",
                        "description": "O fornecedor garante por contrato que não usa os dados da clínica para treinar modelos.",
                        "default": 1
                    },
                    "transferencia_internacional": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Transferência para fora do EEE"
                    },
                    "garantias": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Garantias",
                        "description": "Certificações, medidas técnicas e organizativas, localização dos dados.",
                        "maxLength": 255
                    },
                    "contacto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Contacto",
                        "maxLength": 190
                    },
                    "website": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "uri",
                        "title": "Site"
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "revisao_juridica": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Revisto pelo encarregado/jurídico",
                        "description": "Marque depois de o encarregado de proteção de dados ou o jurídico rever o texto. Os textos fornecidos com o sistema chegam por rever."
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 5000
                    }
                },
                "required": [
                    "nome",
                    "finalidade"
                ]
            },
            "Recurso_supressoes": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal",
                        "enum": [
                            "email",
                            "sms",
                            "whatsapp",
                            "telefone",
                            "todos"
                        ],
                        "x-enum-rotulos": {
                            "email": "Email",
                            "sms": "SMS",
                            "whatsapp": "WhatsApp",
                            "telefone": "Telefone",
                            "todos": "Todos os canais"
                        },
                        "default": "todos"
                    },
                    "valor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Contacto",
                        "description": "Email ou telefone. É guardado de forma irreversível (só a impressão digital) e mostrado mascarado.",
                        "maxLength": 190
                    },
                    "valor_mascarado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Contacto",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo",
                        "maxLength": 255
                    },
                    "origem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Origem",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "conformidade",
                "x-anagen-clinico": false
            },
            "Recurso_supressoes_Entrada": {
                "type": "object",
                "properties": {
                    "canal": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Canal",
                        "enum": [
                            "email",
                            "sms",
                            "whatsapp",
                            "telefone",
                            "todos"
                        ],
                        "x-enum-rotulos": {
                            "email": "Email",
                            "sms": "SMS",
                            "whatsapp": "WhatsApp",
                            "telefone": "Telefone",
                            "todos": "Todos os canais"
                        },
                        "default": "todos"
                    },
                    "valor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Contacto",
                        "description": "Email ou telefone. É guardado de forma irreversível (só a impressão digital) e mostrado mascarado.",
                        "maxLength": 190
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo",
                        "maxLength": 255
                    }
                },
                "required": [
                    "canal",
                    "valor"
                ]
            },
            "Recurso_tabelas_precos": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "por_enxerto",
                            "escalao",
                            "sessao",
                            "pacote"
                        ],
                        "x-enum-rotulos": {
                            "por_enxerto": "Preço por enxerto",
                            "escalao": "Escalões de enxertos",
                            "sessao": "Preço por sessão",
                            "pacote": "Pacotes"
                        },
                        "default": "escalao"
                    },
                    "procedimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Procedimento",
                        "description": "Deixe vazio para usar em qualquer procedimento.",
                        "x-anagen-recurso": "procedimentos"
                    },
                    "local_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Local",
                        "description": "Vazio = todos os locais. Uma tabela de um local tem prioridade sobre a geral nas propostas desse local.",
                        "x-anagen-recurso": "locais"
                    },
                    "regras": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Regras",
                        "description": "Preços, escalões, zonas, pacotes e extras."
                    },
                    "iva_taxa": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Taxa de IVA (%)",
                        "description": "Deixe vazio para usar a do procedimento.",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2
                    },
                    "moeda": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Moeda",
                        "enum": [
                            "EUR"
                        ],
                        "x-enum-rotulos": {
                            "EUR": "EUR"
                        },
                        "readOnly": true,
                        "default": "EUR"
                    },
                    "valida_desde": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válida desde"
                    },
                    "valida_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válida até"
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 4000
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-clinico": false
            },
            "Recurso_tabelas_precos_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "por_enxerto",
                            "escalao",
                            "sessao",
                            "pacote"
                        ],
                        "x-enum-rotulos": {
                            "por_enxerto": "Preço por enxerto",
                            "escalao": "Escalões de enxertos",
                            "sessao": "Preço por sessão",
                            "pacote": "Pacotes"
                        },
                        "default": "escalao"
                    },
                    "procedimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Procedimento",
                        "description": "Deixe vazio para usar em qualquer procedimento.",
                        "x-anagen-recurso": "procedimentos"
                    },
                    "local_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Local",
                        "description": "Vazio = todos os locais. Uma tabela de um local tem prioridade sobre a geral nas propostas desse local.",
                        "x-anagen-recurso": "locais"
                    },
                    "regras": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Regras",
                        "description": "Preços, escalões, zonas, pacotes e extras."
                    },
                    "iva_taxa": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Taxa de IVA (%)",
                        "description": "Deixe vazio para usar a do procedimento.",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2
                    },
                    "valida_desde": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válida desde"
                    },
                    "valida_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válida até"
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 4000
                    }
                },
                "required": [
                    "nome",
                    "tipo",
                    "regras"
                ]
            },
            "Recurso_tarefas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 255
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "description": "Contexto para quem vai fazer. Não escreva aqui dados clínicos.",
                        "maxLength": 5000
                    },
                    "prioridade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Prioridade",
                        "enum": [
                            "baixa",
                            "normal",
                            "alta",
                            "urgente"
                        ],
                        "x-enum-rotulos": {
                            "baixa": "Baixa",
                            "normal": "Normal",
                            "alta": "Alta",
                            "urgente": "Urgente"
                        },
                        "default": "normal"
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "aberta",
                            "em_curso",
                            "concluida",
                            "cancelada"
                        ],
                        "x-enum-rotulos": {
                            "aberta": "Aberta",
                            "em_curso": "Em curso",
                            "concluida": "Concluída",
                            "cancelada": "Cancelada"
                        },
                        "default": "aberta"
                    },
                    "prazo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Prazo"
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Responsável",
                        "description": "Sem responsável nem departamento, a tarefa fica para quem a cria.",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "departamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Departamento",
                        "enum": [
                            "administracao",
                            "medico",
                            "enfermagem",
                            "tecnico",
                            "comercial",
                            "rececao"
                        ],
                        "x-enum-rotulos": {
                            "administracao": "Administração",
                            "medico": "Médico",
                            "enfermagem": "Enfermagem",
                            "tecnico": "Técnico",
                            "comercial": "Comercial",
                            "rececao": "Receção"
                        }
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes",
                        "x-anagen-permissao": "ficha.identificacao"
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Lead",
                        "x-anagen-recurso": "leads",
                        "x-anagen-permissao": "crm.leads"
                    },
                    "cirurgia_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Cirurgia",
                        "x-anagen-recurso": "cirurgias",
                        "x-anagen-permissao": "bloco.mapa"
                    },
                    "origem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Origem",
                        "enum": [
                            "manual",
                            "automatica",
                            "mensagem",
                            "agente"
                        ],
                        "x-enum-rotulos": {
                            "manual": "Manual",
                            "automatica": "Automática",
                            "mensagem": "Do chat",
                            "agente": "Do assistente"
                        },
                        "readOnly": true
                    },
                    "concluida_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Concluída em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "equipa.tarefas",
                "x-anagen-clinico": false
            },
            "Recurso_tarefas_Entrada": {
                "type": "object",
                "properties": {
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 255
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "description": "Contexto para quem vai fazer. Não escreva aqui dados clínicos.",
                        "maxLength": 5000
                    },
                    "prioridade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Prioridade",
                        "enum": [
                            "baixa",
                            "normal",
                            "alta",
                            "urgente"
                        ],
                        "x-enum-rotulos": {
                            "baixa": "Baixa",
                            "normal": "Normal",
                            "alta": "Alta",
                            "urgente": "Urgente"
                        },
                        "default": "normal"
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "aberta",
                            "em_curso",
                            "concluida",
                            "cancelada"
                        ],
                        "x-enum-rotulos": {
                            "aberta": "Aberta",
                            "em_curso": "Em curso",
                            "concluida": "Concluída",
                            "cancelada": "Cancelada"
                        },
                        "default": "aberta"
                    },
                    "prazo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Prazo"
                    },
                    "responsavel_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Responsável",
                        "description": "Sem responsável nem departamento, a tarefa fica para quem a cria.",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "departamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Departamento",
                        "enum": [
                            "administracao",
                            "medico",
                            "enfermagem",
                            "tecnico",
                            "comercial",
                            "rececao"
                        ],
                        "x-enum-rotulos": {
                            "administracao": "Administração",
                            "medico": "Médico",
                            "enfermagem": "Enfermagem",
                            "tecnico": "Técnico",
                            "comercial": "Comercial",
                            "rececao": "Receção"
                        }
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes",
                        "x-anagen-permissao": "ficha.identificacao"
                    },
                    "lead_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Lead",
                        "x-anagen-recurso": "leads",
                        "x-anagen-permissao": "crm.leads"
                    },
                    "cirurgia_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Cirurgia",
                        "x-anagen-recurso": "cirurgias",
                        "x-anagen-permissao": "bloco.mapa"
                    }
                },
                "required": [
                    "titulo"
                ]
            },
            "Recurso_teleconsultas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes",
                        "readOnly": true
                    },
                    "medico_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Médico",
                        "x-anagen-recurso": "utilizadores",
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "agendada",
                            "sala_espera",
                            "em_curso",
                            "terminada",
                            "fechada"
                        ],
                        "x-enum-rotulos": {
                            "agendada": "Agendada",
                            "sala_espera": "Na sala de espera",
                            "em_curso": "Em curso",
                            "terminada": "Terminada",
                            "fechada": "Fechada"
                        },
                        "readOnly": true
                    },
                    "inicio_real": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Início",
                        "readOnly": true
                    },
                    "fim_real": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Fim",
                        "readOnly": true
                    },
                    "relatorio_fechado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Relatório fechado em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "teleconsulta",
                "x-anagen-clinico": true
            },
            "Recurso_teleconsultas_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_telefonia_extensoes": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "departamento",
                            "pessoa"
                        ],
                        "x-enum-rotulos": {
                            "departamento": "Departamento",
                            "pessoa": "Pessoa"
                        },
                        "default": "departamento"
                    },
                    "departamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Departamento",
                        "enum": [
                            "rececao",
                            "comercial",
                            "enfermagem",
                            "medico",
                            "tecnico",
                            "administracao"
                        ],
                        "x-enum-rotulos": {
                            "rececao": "Receção",
                            "comercial": "Comercial",
                            "enfermagem": "Enfermagem",
                            "medico": "Médico",
                            "tecnico": "Técnico",
                            "administracao": "Administração"
                        }
                    },
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Pessoa",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "extensao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Extensão ou número",
                        "description": "Como a central a conhece (ex.: 201).",
                        "maxLength": 40
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-clinico": false
            },
            "Recurso_telefonia_extensoes_Entrada": {
                "type": "object",
                "properties": {
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo",
                        "enum": [
                            "departamento",
                            "pessoa"
                        ],
                        "x-enum-rotulos": {
                            "departamento": "Departamento",
                            "pessoa": "Pessoa"
                        },
                        "default": "departamento"
                    },
                    "departamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Departamento",
                        "enum": [
                            "rececao",
                            "comercial",
                            "enfermagem",
                            "medico",
                            "tecnico",
                            "administracao"
                        ],
                        "x-enum-rotulos": {
                            "rececao": "Receção",
                            "comercial": "Comercial",
                            "enfermagem": "Enfermagem",
                            "medico": "Médico",
                            "tecnico": "Técnico",
                            "administracao": "Administração"
                        }
                    },
                    "utilizador_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Pessoa",
                        "x-anagen-recurso": "utilizadores"
                    },
                    "extensao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Extensão ou número",
                        "description": "Como a central a conhece (ex.: 201).",
                        "maxLength": 40
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": true
                    }
                },
                "required": [
                    "tipo",
                    "extensao"
                ]
            },
            "Recurso_telefonia_numeros": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "numero": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Número"
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "origem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Origem do lead",
                        "enum": [
                            "site",
                            "pre_avaliacao",
                            "meta",
                            "google",
                            "whatsapp",
                            "instagram",
                            "messenger",
                            "telefone",
                            "presencial",
                            "recomendacao",
                            "agente_voz",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "site": "Site",
                            "pre_avaliacao": "Pré-avaliação",
                            "meta": "Meta (anúncios)",
                            "google": "Google (anúncios)",
                            "whatsapp": "WhatsApp",
                            "instagram": "Instagram",
                            "messenger": "Messenger",
                            "telefone": "Telefone",
                            "presencial": "Presencial",
                            "recomendacao": "Recomendação",
                            "agente_voz": "Agente de voz",
                            "outro": "Outro"
                        },
                        "default": "telefone"
                    },
                    "campanha": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Campanha",
                        "maxLength": 120
                    },
                    "utm_source": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "utm_source",
                        "maxLength": 120
                    },
                    "utm_medium": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "utm_medium",
                        "maxLength": 120
                    },
                    "utm_campaign": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "utm_campaign",
                        "maxLength": 120
                    },
                    "menu_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Menu de voz",
                        "description": "Vazio: atende o menu principal.",
                        "x-anagen-recurso": "voz_menus"
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-clinico": false
            },
            "Recurso_telefonia_numeros_Entrada": {
                "type": "object",
                "properties": {
                    "numero": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Número"
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "origem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Origem do lead",
                        "enum": [
                            "site",
                            "pre_avaliacao",
                            "meta",
                            "google",
                            "whatsapp",
                            "instagram",
                            "messenger",
                            "telefone",
                            "presencial",
                            "recomendacao",
                            "agente_voz",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "site": "Site",
                            "pre_avaliacao": "Pré-avaliação",
                            "meta": "Meta (anúncios)",
                            "google": "Google (anúncios)",
                            "whatsapp": "WhatsApp",
                            "instagram": "Instagram",
                            "messenger": "Messenger",
                            "telefone": "Telefone",
                            "presencial": "Presencial",
                            "recomendacao": "Recomendação",
                            "agente_voz": "Agente de voz",
                            "outro": "Outro"
                        },
                        "default": "telefone"
                    },
                    "campanha": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Campanha",
                        "maxLength": 120
                    },
                    "utm_source": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "utm_source",
                        "maxLength": 120
                    },
                    "utm_medium": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "utm_medium",
                        "maxLength": 120
                    },
                    "utm_campaign": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "utm_campaign",
                        "maxLength": 120
                    },
                    "menu_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Menu de voz",
                        "description": "Vazio: atende o menu principal.",
                        "x-anagen-recurso": "voz_menus"
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": true
                    }
                },
                "required": [
                    "numero",
                    "nome"
                ]
            },
            "Recurso_terminais_pagamento": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "fornecedor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fornecedor",
                        "enum": [
                            "sumup",
                            "stripe"
                        ],
                        "x-enum-rotulos": {
                            "sumup": "SumUp",
                            "stripe": "Stripe Terminal"
                        },
                        "default": "sumup"
                    },
                    "local_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Local",
                        "description": "Vazio = serve todos os locais.",
                        "x-anagen-recurso": "locais"
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "por_emparelhar",
                            "ativo",
                            "inativo"
                        ],
                        "x-enum-rotulos": {
                            "por_emparelhar": "Por emparelhar",
                            "ativo": "Ativo",
                            "inativo": "Inativo"
                        },
                        "default": "por_emparelhar"
                    },
                    "identificador": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Identificador no fornecedor",
                        "description": "Preenchido ao emparelhar.",
                        "maxLength": 120
                    },
                    "localizacao_externa": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Localização Stripe (tml_…)",
                        "description": "Vazio = a localização por omissão das Definições.",
                        "maxLength": 120
                    },
                    "ultimo_estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Último estado",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "ultimo_contacto_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Último contacto",
                        "readOnly": true
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 2000
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-clinico": false
            },
            "Recurso_terminais_pagamento_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "fornecedor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Fornecedor",
                        "enum": [
                            "sumup",
                            "stripe"
                        ],
                        "x-enum-rotulos": {
                            "sumup": "SumUp",
                            "stripe": "Stripe Terminal"
                        },
                        "default": "sumup"
                    },
                    "local_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Local",
                        "description": "Vazio = serve todos os locais.",
                        "x-anagen-recurso": "locais"
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "por_emparelhar",
                            "ativo",
                            "inativo"
                        ],
                        "x-enum-rotulos": {
                            "por_emparelhar": "Por emparelhar",
                            "ativo": "Ativo",
                            "inativo": "Inativo"
                        },
                        "default": "por_emparelhar"
                    },
                    "identificador": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Identificador no fornecedor",
                        "description": "Preenchido ao emparelhar.",
                        "maxLength": 120
                    },
                    "localizacao_externa": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Localização Stripe (tml_…)",
                        "description": "Vazio = a localização por omissão das Definições.",
                        "maxLength": 120
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas",
                        "maxLength": 2000
                    }
                },
                "required": [
                    "nome",
                    "fornecedor"
                ]
            },
            "Recurso_tratamentos_complementares": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tratamento",
                        "enum": [
                            "prp",
                            "minoxidil",
                            "finasterida",
                            "dutasterida",
                            "mesoterapia",
                            "laser",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "prp": "PRP",
                            "minoxidil": "Minoxidil",
                            "finasterida": "Finasterida",
                            "dutasterida": "Dutasterida",
                            "mesoterapia": "Mesoterapia",
                            "laser": "Laser",
                            "outro": "Outro"
                        }
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Episódio",
                        "minimum": 1
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Início"
                    },
                    "fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Fim"
                    },
                    "adesao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Adesão",
                        "enum": [
                            "boa",
                            "parcial",
                            "fraca",
                            "desconhecida"
                        ],
                        "x-enum-rotulos": {
                            "boa": "Boa",
                            "parcial": "Parcial",
                            "fraca": "Fraca",
                            "desconhecida": "Desconhecida"
                        },
                        "default": "desconhecida"
                    },
                    "sessoes_previstas": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Sessões previstas",
                        "maximum": 200,
                        "minimum": 0
                    },
                    "sessoes_feitas": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Sessões feitas",
                        "maximum": 200,
                        "minimum": 0,
                        "default": 0
                    },
                    "proxima_sessao_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Próxima sessão"
                    },
                    "lembretes": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Lembretes ao paciente",
                        "default": 1
                    },
                    "prescricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Prescrição",
                        "maxLength": 4000,
                        "x-anagen-permissao": "ficha.clinica",
                        "x-anagen-cifrado": "clinico"
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas clínicas",
                        "maxLength": 4000,
                        "x-anagen-permissao": "ficha.clinica",
                        "x-anagen-cifrado": "clinico"
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "acompanhamento",
                "x-anagen-clinico": true
            },
            "Recurso_tratamentos_complementares_Entrada": {
                "type": "object",
                "properties": {
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tratamento",
                        "enum": [
                            "prp",
                            "minoxidil",
                            "finasterida",
                            "dutasterida",
                            "mesoterapia",
                            "laser",
                            "outro"
                        ],
                        "x-enum-rotulos": {
                            "prp": "PRP",
                            "minoxidil": "Minoxidil",
                            "finasterida": "Finasterida",
                            "dutasterida": "Dutasterida",
                            "mesoterapia": "Mesoterapia",
                            "laser": "Laser",
                            "outro": "Outro"
                        }
                    },
                    "episodio_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Episódio",
                        "minimum": 1
                    },
                    "inicio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Início"
                    },
                    "fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Fim"
                    },
                    "adesao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Adesão",
                        "enum": [
                            "boa",
                            "parcial",
                            "fraca",
                            "desconhecida"
                        ],
                        "x-enum-rotulos": {
                            "boa": "Boa",
                            "parcial": "Parcial",
                            "fraca": "Fraca",
                            "desconhecida": "Desconhecida"
                        },
                        "default": "desconhecida"
                    },
                    "sessoes_previstas": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Sessões previstas",
                        "maximum": 200,
                        "minimum": 0
                    },
                    "sessoes_feitas": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Sessões feitas",
                        "maximum": 200,
                        "minimum": 0,
                        "default": 0
                    },
                    "proxima_sessao_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Próxima sessão"
                    },
                    "lembretes": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Lembretes ao paciente",
                        "default": 1
                    },
                    "prescricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Prescrição",
                        "maxLength": 4000,
                        "x-anagen-permissao": "ficha.clinica",
                        "x-anagen-cifrado": "clinico"
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas clínicas",
                        "maxLength": 4000,
                        "x-anagen-permissao": "ficha.clinica",
                        "x-anagen-cifrado": "clinico"
                    }
                },
                "required": [
                    "paciente_id",
                    "tipo",
                    "inicio"
                ]
            },
            "Recurso_tricoscopias": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "captura_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Captura",
                        "x-anagen-recurso": "capturas"
                    },
                    "marco_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Marco",
                        "x-anagen-recurso": "marcos_acompanhamento"
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Data"
                    },
                    "subzona": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Subzona",
                        "enum": [
                            "occipital",
                            "parietal_esq",
                            "parietal_dir",
                            "barba",
                            "corpo",
                            "linha_frontal",
                            "tufo_central",
                            "frontal",
                            "tempora_esq",
                            "tempora_dir",
                            "media",
                            "coroa"
                        ],
                        "x-enum-rotulos": {
                            "occipital": "Occipital",
                            "parietal_esq": "Parietal esquerda",
                            "parietal_dir": "Parietal direita",
                            "barba": "Barba",
                            "corpo": "Corpo",
                            "linha_frontal": "Linha frontal",
                            "tufo_central": "Tufo central",
                            "frontal": "Frontal",
                            "tempora_esq": "Têmpora esquerda",
                            "tempora_dir": "Têmpora direita",
                            "media": "Zona média",
                            "coroa": "Coroa"
                        }
                    },
                    "aparelho": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Aparelho",
                        "maxLength": 80
                    },
                    "ampliacao": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Ampliação",
                        "maximum": 1000,
                        "minimum": 1,
                        "x-casas": 1
                    },
                    "area_campo_mm2": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Área do campo calibrada",
                        "description": "Calibrada para o aparelho e a ampliação (100 mm² = 1 cm²).",
                        "maximum": 1000,
                        "minimum": 0.01,
                        "x-unidade": "mm²",
                        "x-casas": 2
                    },
                    "ponto": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Ponto",
                        "description": "{\"x\": 0.5, \"y\": 0.9} no diagrama (0–1) ou {\"x\", \"y\", \"z\"} no modelo 3D."
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Imagem do campo"
                    },
                    "uf_1": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "UF de 1 cabelo",
                        "maximum": 2000,
                        "minimum": 0,
                        "default": 0
                    },
                    "uf_2": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "UF de 2 cabelos",
                        "maximum": 2000,
                        "minimum": 0,
                        "default": 0
                    },
                    "uf_3": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "UF de 3 cabelos",
                        "maximum": 2000,
                        "minimum": 0,
                        "default": 0
                    },
                    "uf_4": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "UF de 4 ou mais",
                        "maximum": 2000,
                        "minimum": 0,
                        "default": 0
                    },
                    "cabelos_total": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Cabelos no campo",
                        "description": "Vazio: calculado pelas UF (4+ conta como 4).",
                        "maximum": 10000,
                        "minimum": 0
                    },
                    "calibre_mm": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Calibre médio",
                        "maximum": 0.3,
                        "minimum": 0,
                        "x-unidade": "mm",
                        "x-casas": 4
                    },
                    "calibre_amostra": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Cabelos medidos no calibre",
                        "maximum": 10000,
                        "minimum": 0
                    },
                    "pct_vellus": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Vellus",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2
                    },
                    "pct_intermedios": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Intermédios",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2
                    },
                    "pct_terminais": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Terminais",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2
                    },
                    "miniaturizacao_pct": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Miniaturização",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2
                    },
                    "densidade_uf_cm2": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Densidade (UF)",
                        "x-unidade": "UF/cm²",
                        "x-casas": 1,
                        "readOnly": true
                    },
                    "densidade_cabelos_cm2": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Densidade (cabelos)",
                        "x-unidade": "cabelos/cm²",
                        "x-casas": 1,
                        "readOnly": true
                    },
                    "cabelos_por_uf": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Cabelos por UF",
                        "x-unidade": "cabelos/UF",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "valor_cobertura": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Valor de cobertura",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas clínicas",
                        "maxLength": 4000,
                        "x-anagen-cifrado": "clinico"
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "ficha.captura",
                "x-anagen-clinico": true
            },
            "Recurso_tricoscopias_Entrada": {
                "type": "object",
                "properties": {
                    "paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente",
                        "x-anagen-recurso": "pacientes"
                    },
                    "captura_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Captura",
                        "x-anagen-recurso": "capturas"
                    },
                    "marco_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Marco",
                        "x-anagen-recurso": "marcos_acompanhamento"
                    },
                    "data": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Data"
                    },
                    "subzona": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Subzona",
                        "enum": [
                            "occipital",
                            "parietal_esq",
                            "parietal_dir",
                            "barba",
                            "corpo",
                            "linha_frontal",
                            "tufo_central",
                            "frontal",
                            "tempora_esq",
                            "tempora_dir",
                            "media",
                            "coroa"
                        ],
                        "x-enum-rotulos": {
                            "occipital": "Occipital",
                            "parietal_esq": "Parietal esquerda",
                            "parietal_dir": "Parietal direita",
                            "barba": "Barba",
                            "corpo": "Corpo",
                            "linha_frontal": "Linha frontal",
                            "tufo_central": "Tufo central",
                            "frontal": "Frontal",
                            "tempora_esq": "Têmpora esquerda",
                            "tempora_dir": "Têmpora direita",
                            "media": "Zona média",
                            "coroa": "Coroa"
                        }
                    },
                    "aparelho": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Aparelho",
                        "maxLength": 80
                    },
                    "ampliacao": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Ampliação",
                        "maximum": 1000,
                        "minimum": 1,
                        "x-casas": 1
                    },
                    "area_campo_mm2": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Área do campo calibrada",
                        "description": "Calibrada para o aparelho e a ampliação (100 mm² = 1 cm²).",
                        "maximum": 1000,
                        "minimum": 0.01,
                        "x-unidade": "mm²",
                        "x-casas": 2
                    },
                    "ponto": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Ponto",
                        "description": "{\"x\": 0.5, \"y\": 0.9} no diagrama (0–1) ou {\"x\", \"y\", \"z\"} no modelo 3D."
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Imagem do campo"
                    },
                    "uf_1": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "UF de 1 cabelo",
                        "maximum": 2000,
                        "minimum": 0,
                        "default": 0
                    },
                    "uf_2": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "UF de 2 cabelos",
                        "maximum": 2000,
                        "minimum": 0,
                        "default": 0
                    },
                    "uf_3": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "UF de 3 cabelos",
                        "maximum": 2000,
                        "minimum": 0,
                        "default": 0
                    },
                    "uf_4": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "UF de 4 ou mais",
                        "maximum": 2000,
                        "minimum": 0,
                        "default": 0
                    },
                    "cabelos_total": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Cabelos no campo",
                        "description": "Vazio: calculado pelas UF (4+ conta como 4).",
                        "maximum": 10000,
                        "minimum": 0
                    },
                    "calibre_mm": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Calibre médio",
                        "maximum": 0.3,
                        "minimum": 0,
                        "x-unidade": "mm",
                        "x-casas": 4
                    },
                    "calibre_amostra": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Cabelos medidos no calibre",
                        "maximum": 10000,
                        "minimum": 0
                    },
                    "pct_vellus": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Vellus",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2
                    },
                    "pct_intermedios": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Intermédios",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2
                    },
                    "pct_terminais": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Terminais",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2
                    },
                    "miniaturizacao_pct": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Miniaturização",
                        "maximum": 100,
                        "minimum": 0,
                        "x-casas": 2
                    },
                    "notas": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Notas clínicas",
                        "maxLength": 4000,
                        "x-anagen-cifrado": "clinico"
                    }
                },
                "required": [
                    "paciente_id",
                    "subzona",
                    "area_campo_mm2"
                ]
            },
            "Recurso_utilizadores": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "email": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "email",
                        "title": "Email",
                        "description": "Email profissional usado para entrar. Recebe o convite para definir a palavra-passe.",
                        "maxLength": 190
                    },
                    "telefone": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Telefone"
                    },
                    "perfil_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Perfil",
                        "x-anagen-recurso": "perfis"
                    },
                    "nivel": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nível",
                        "description": "Chefe de equipa vê o trabalho da sua equipa; direção tem visão alargada.",
                        "enum": [
                            "colaborador",
                            "chefe_equipa",
                            "direcao"
                        ],
                        "x-enum-rotulos": {
                            "colaborador": "Colaborador",
                            "chefe_equipa": "Chefe de equipa",
                            "direcao": "Direção"
                        },
                        "default": "colaborador"
                    },
                    "departamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Departamento",
                        "description": "Departamento onde a pessoa trabalha. Vazio = o da família do perfil. A direção vê o departamento.",
                        "enum": [
                            "administracao",
                            "medico",
                            "enfermagem",
                            "tecnico",
                            "comercial",
                            "rececao"
                        ],
                        "x-enum-rotulos": {
                            "administracao": "Administração",
                            "medico": "Médico",
                            "enfermagem": "Enfermagem",
                            "tecnico": "Técnico",
                            "comercial": "Comercial",
                            "rececao": "Receção"
                        }
                    },
                    "direcao_clinica": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Direção clínica",
                        "description": "Aprova parâmetros clínicos, respostas do agente e justificações clínicas.",
                        "default": 0
                    },
                    "acessos_resumo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Exceções de permissão ativas",
                        "description": "Geridas em Perfis e permissões › Por pessoa.",
                        "readOnly": true
                    },
                    "cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9a-fA-F]{6}$",
                        "title": "Cor",
                        "description": "Cor da pessoa na agenda e no mapa de cirurgias."
                    },
                    "especialidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Especialidade",
                        "maxLength": 120
                    },
                    "cedula": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Cédula profissional",
                        "maxLength": 40
                    },
                    "ordem_profissional": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Ordem profissional",
                        "maxLength": 60
                    },
                    "vinculo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Vínculo",
                        "enum": [
                            "contrato",
                            "prestacao",
                            "socio",
                            "estagio"
                        ],
                        "x-enum-rotulos": {
                            "contrato": "Contrato",
                            "prestacao": "Prestação de serviços",
                            "socio": "Sócio",
                            "estagio": "Estágio"
                        }
                    },
                    "ers_atualizar_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Atualizar registo na ERS até",
                        "description": "Data-limite para atualizar o registo do profissional."
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português (Portugal)",
                            "pt-BR": "Português (Brasil)",
                            "en": "English",
                            "es": "Español",
                            "fr": "Français",
                            "de": "Deutsch"
                        },
                        "default": "pt-PT"
                    },
                    "ip_permitidos": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Endereços permitidos",
                        "description": "Opcional. Um por linha: endereço ou rede (ex.: 192.168.1.0/24).",
                        "maxLength": 2000
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "totp_ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Segundo fator",
                        "readOnly": true
                    },
                    "ultimo_acesso_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Último acesso",
                        "readOnly": true
                    },
                    "bloqueado_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Bloqueado até",
                        "readOnly": true
                    },
                    "sigilo_aceite_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Termo de sigilo aceite em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "admin.utilizadores",
                "x-anagen-clinico": false
            },
            "Recurso_utilizadores_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 160
                    },
                    "email": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "email",
                        "title": "Email",
                        "description": "Email profissional usado para entrar. Recebe o convite para definir a palavra-passe.",
                        "maxLength": 190
                    },
                    "telefone": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Telefone"
                    },
                    "perfil_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Perfil",
                        "x-anagen-recurso": "perfis"
                    },
                    "nivel": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nível",
                        "description": "Chefe de equipa vê o trabalho da sua equipa; direção tem visão alargada.",
                        "enum": [
                            "colaborador",
                            "chefe_equipa",
                            "direcao"
                        ],
                        "x-enum-rotulos": {
                            "colaborador": "Colaborador",
                            "chefe_equipa": "Chefe de equipa",
                            "direcao": "Direção"
                        },
                        "default": "colaborador"
                    },
                    "departamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Departamento",
                        "description": "Departamento onde a pessoa trabalha. Vazio = o da família do perfil. A direção vê o departamento.",
                        "enum": [
                            "administracao",
                            "medico",
                            "enfermagem",
                            "tecnico",
                            "comercial",
                            "rececao"
                        ],
                        "x-enum-rotulos": {
                            "administracao": "Administração",
                            "medico": "Médico",
                            "enfermagem": "Enfermagem",
                            "tecnico": "Técnico",
                            "comercial": "Comercial",
                            "rececao": "Receção"
                        }
                    },
                    "direcao_clinica": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Direção clínica",
                        "description": "Aprova parâmetros clínicos, respostas do agente e justificações clínicas.",
                        "default": 0
                    },
                    "cor": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "pattern": "^#[0-9a-fA-F]{6}$",
                        "title": "Cor",
                        "description": "Cor da pessoa na agenda e no mapa de cirurgias."
                    },
                    "especialidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Especialidade",
                        "maxLength": 120
                    },
                    "cedula": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Cédula profissional",
                        "maxLength": 40
                    },
                    "ordem_profissional": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Ordem profissional",
                        "maxLength": 60
                    },
                    "vinculo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Vínculo",
                        "enum": [
                            "contrato",
                            "prestacao",
                            "socio",
                            "estagio"
                        ],
                        "x-enum-rotulos": {
                            "contrato": "Contrato",
                            "prestacao": "Prestação de serviços",
                            "socio": "Sócio",
                            "estagio": "Estágio"
                        }
                    },
                    "ers_atualizar_ate": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Atualizar registo na ERS até",
                        "description": "Data-limite para atualizar o registo do profissional."
                    },
                    "idioma": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português (Portugal)",
                            "pt-BR": "Português (Brasil)",
                            "en": "English",
                            "es": "Español",
                            "fr": "Français",
                            "de": "Deutsch"
                        },
                        "default": "pt-PT"
                    },
                    "ip_permitidos": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Endereços permitidos",
                        "description": "Opcional. Um por linha: endereço ou rede (ex.: 192.168.1.0/24).",
                        "maxLength": 2000
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    }
                },
                "required": [
                    "nome",
                    "email",
                    "perfil_id",
                    "nivel"
                ]
            },
            "Recurso_vales": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "codigo_fim": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Código (fim)",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "beneficiario_nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Para",
                        "maxLength": 160
                    },
                    "comprador_nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Comprador",
                        "maxLength": 160,
                        "readOnly": true
                    },
                    "valor_inicial": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Valor",
                        "x-moeda": "EUR",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "saldo": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Saldo",
                        "x-moeda": "EUR",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "por_pagar",
                            "ativo",
                            "esgotado",
                            "expirado",
                            "anulado"
                        ],
                        "x-enum-rotulos": {
                            "por_pagar": "Por pagar",
                            "ativo": "Ativo",
                            "esgotado": "Usado",
                            "expirado": "Expirado",
                            "anulado": "Anulado"
                        },
                        "readOnly": true
                    },
                    "validade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válido até",
                        "description": "Só pode ser prolongada."
                    },
                    "finalidade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Tipo de vale",
                        "enum": [
                            "multipla",
                            "unica"
                        ],
                        "x-enum-rotulos": {
                            "multipla": "Finalidade múltipla",
                            "unica": "Finalidade única"
                        },
                        "readOnly": true
                    },
                    "procedimento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Procedimento",
                        "x-anagen-recurso": "procedimentos",
                        "readOnly": true
                    },
                    "comprador_paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente comprador",
                        "x-anagen-recurso": "pacientes",
                        "readOnly": true
                    },
                    "beneficiario_paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente beneficiário",
                        "x-anagen-recurso": "pacientes"
                    },
                    "mensagem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Mensagem",
                        "maxLength": 500
                    },
                    "pagamento_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Pagamento da venda",
                        "x-anagen-recurso": "pagamentos",
                        "readOnly": true
                    },
                    "local_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Local",
                        "x-anagen-recurso": "locais",
                        "readOnly": true
                    },
                    "ativado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Ativo desde",
                        "readOnly": true
                    },
                    "motivo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Motivo",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "financeiro.pagamentos",
                "x-anagen-clinico": false
            },
            "Recurso_vales_Entrada": {
                "type": "object",
                "properties": {
                    "beneficiario_nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Para",
                        "maxLength": 160
                    },
                    "validade": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "title": "Válido até",
                        "description": "Só pode ser prolongada."
                    },
                    "beneficiario_paciente_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Paciente beneficiário",
                        "x-anagen-recurso": "pacientes"
                    },
                    "mensagem": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Mensagem",
                        "maxLength": 500
                    }
                }
            },
            "Recurso_voz_gravacoes": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 120
                    },
                    "lingua": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        },
                        "default": "pt-PT"
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Áudio",
                        "description": "MP3 ou WAV, até 10 MB."
                    },
                    "texto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "O que a mensagem diz",
                        "description": "Usado quando a central não consegue tocar o ficheiro.",
                        "maxLength": 2000
                    },
                    "duracao_ms": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Duração (ms)",
                        "minimum": 0
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-clinico": false
            },
            "Recurso_voz_gravacoes_Entrada": {
                "type": "object",
                "properties": {
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Título",
                        "maxLength": 120
                    },
                    "lingua": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        },
                        "default": "pt-PT"
                    },
                    "ficheiro_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Áudio",
                        "description": "MP3 ou WAV, até 10 MB."
                    },
                    "texto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "O que a mensagem diz",
                        "description": "Usado quando a central não consegue tocar o ficheiro.",
                        "maxLength": 2000
                    },
                    "duracao_ms": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Duração (ms)",
                        "minimum": 0
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": true
                    }
                },
                "required": [
                    "titulo",
                    "lingua",
                    "ficheiro_id"
                ]
            },
            "Recurso_voz_menus": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 255
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": true
                    },
                    "predefinido": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Menu principal da clínica",
                        "description": "Atende os números sem menu próprio."
                    },
                    "lingua": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua por omissão",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        },
                        "default": "pt-PT"
                    },
                    "usar_horario_clinica": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Usar o horário da clínica",
                        "default": true
                    },
                    "reconhecido": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Número reconhecido",
                        "enum": [
                            "menu",
                            "gestor",
                            "agente"
                        ],
                        "x-enum-rotulos": {
                            "menu": "Segue o menu",
                            "gestor": "Vai direto ao gestor",
                            "agente": "Vai direto ao agente de voz"
                        },
                        "default": "menu"
                    },
                    "aviso_gravacao": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Dizer o aviso de gravação"
                    },
                    "versao": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Versão",
                        "readOnly": true
                    },
                    "publicado_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Publicado em",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "crm.telefonia",
                "x-anagen-clinico": false
            },
            "Recurso_voz_menus_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 255
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": true
                    },
                    "predefinido": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Menu principal da clínica",
                        "description": "Atende os números sem menu próprio."
                    },
                    "lingua": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Língua por omissão",
                        "enum": [
                            "pt-PT",
                            "pt-BR",
                            "en",
                            "es",
                            "fr",
                            "de"
                        ],
                        "x-enum-rotulos": {
                            "pt-PT": "Português",
                            "pt-BR": "Português (Brasil)",
                            "en": "Inglês",
                            "es": "Espanhol",
                            "fr": "Francês",
                            "de": "Alemão"
                        },
                        "default": "pt-PT"
                    },
                    "usar_horario_clinica": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Usar o horário da clínica",
                        "default": true
                    },
                    "reconhecido": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Número reconhecido",
                        "enum": [
                            "menu",
                            "gestor",
                            "agente"
                        ],
                        "x-enum-rotulos": {
                            "menu": "Segue o menu",
                            "gestor": "Vai direto ao gestor",
                            "agente": "Vai direto ao agente de voz"
                        },
                        "default": "menu"
                    },
                    "aviso_gravacao": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Dizer o aviso de gravação"
                    }
                },
                "required": [
                    "nome"
                ]
            },
            "Recurso_webhooks": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "url": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "uri",
                        "title": "Endereço (https)",
                        "description": "Endereço público do sistema que recebe os eventos. Redes internas não são aceites.",
                        "maxLength": 500
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 500
                    },
                    "eventos": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "*",
                                "campanha.enviada",
                                "cirurgia.fechada",
                                "comunicado.publicado",
                                "consentimento.revogado",
                                "consulta.assinada",
                                "demonstracao.pedida",
                                "documento.assinado",
                                "documento.emitido",
                                "documento_fiscal.emitido",
                                "episodio.aberto",
                                "episodio.estado_alterado",
                                "execucao.areas_confirmadas",
                                "exportacao.concluida",
                                "formulario.respondido",
                                "incidente.registado",
                                "lead.convertido",
                                "lead.criado",
                                "lead.fase_alterada",
                                "marcacao.cancelada",
                                "marcacao.confirmada",
                                "marcacao.criada",
                                "marco.concluido",
                                "motor.versao_aprovada",
                                "paciente.criado",
                                "paciente.fundido",
                                "pagamento.recebido",
                                "pedido_titular.recebido",
                                "plano.aprovado",
                                "portal.consentimento_revogado",
                                "portal.documento_enviado",
                                "portal.fotos_enviadas",
                                "portal.pedido_criado",
                                "pre_avaliacao.recebida",
                                "proposta.aceite",
                                "proposta.enviada",
                                "proposta.recusada",
                                "reclamacao.recebida",
                                "tarefa.concluida",
                                "tarefa.criada",
                                "webhook.teste"
                            ]
                        },
                        "title": "Eventos",
                        "description": "Escolha os acontecimentos que este destino recebe.",
                        "x-enum-rotulos": {
                            "*": "Todos os eventos",
                            "campanha.enviada": "Campanha enviada",
                            "cirurgia.fechada": "Cirurgia fechada",
                            "comunicado.publicado": "Comunicado interno publicado",
                            "consentimento.revogado": "Consentimento retirado",
                            "consulta.assinada": "Consulta assinada",
                            "demonstracao.pedida": "Pedido de demonstração do AnagenSys",
                            "documento.assinado": "Documento assinado",
                            "documento.emitido": "Documento emitido",
                            "documento_fiscal.emitido": "Documento fiscal emitido",
                            "episodio.aberto": "Episódio de tratamento aberto",
                            "episodio.estado_alterado": "Estado do episódio alterado",
                            "execucao.areas_confirmadas": "Áreas do dia 0 confirmadas",
                            "exportacao.concluida": "Exportação total pronta",
                            "formulario.respondido": "Formulário respondido",
                            "incidente.registado": "Incidente de segurança registado",
                            "lead.convertido": "Lead convertido em paciente",
                            "lead.criado": "Lead criado",
                            "lead.fase_alterada": "Lead mudou de fase",
                            "marcacao.cancelada": "Marcação cancelada",
                            "marcacao.confirmada": "Marcação confirmada",
                            "marcacao.criada": "Marcação criada",
                            "marco.concluido": "Marco do acompanhamento concluído",
                            "motor.versao_aprovada": "Parâmetros do motor aprovados",
                            "paciente.criado": "Paciente criado",
                            "paciente.fundido": "Pacientes fundidos",
                            "pagamento.recebido": "Pagamento recebido",
                            "pedido_titular.recebido": "Pedido de titular recebido",
                            "plano.aprovado": "Plano cirúrgico aprovado",
                            "portal.consentimento_revogado": "Autorização retirada no portal",
                            "portal.documento_enviado": "Documento enviado pelo paciente",
                            "portal.fotos_enviadas": "Fotografias de acompanhamento enviadas",
                            "portal.pedido_criado": "Pedido criado no portal",
                            "pre_avaliacao.recebida": "Pré-avaliação online recebida",
                            "proposta.aceite": "Proposta aceite",
                            "proposta.enviada": "Proposta enviada",
                            "proposta.recusada": "Proposta recusada",
                            "reclamacao.recebida": "Reclamação, elogio ou sugestão recebida",
                            "tarefa.concluida": "Tarefa concluída",
                            "tarefa.criada": "Tarefa criada",
                            "webhook.teste": "Entrega de teste"
                        }
                    },
                    "segredo_prefixo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Segredo (início)",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "segredo_visivel": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Segredo",
                        "description": "Copie-o para o sistema de destino. Não volta a ser mostrado.",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    },
                    "ultimo_estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Última entrega",
                        "enum": [
                            "entregue",
                            "falhada",
                            "desistida",
                            "pendente"
                        ],
                        "x-enum-rotulos": {
                            "entregue": "Entregue",
                            "falhada": "Falhou (a repetir)",
                            "desistida": "Sem sucesso",
                            "pendente": "Pendente"
                        },
                        "readOnly": true
                    },
                    "ultima_entrega_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Última entrega em",
                        "readOnly": true
                    },
                    "falhas_seguidas": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Falhas seguidas",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-clinico": false
            },
            "Recurso_webhooks_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome",
                        "maxLength": 120
                    },
                    "url": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "uri",
                        "title": "Endereço (https)",
                        "description": "Endereço público do sistema que recebe os eventos. Redes internas não são aceites.",
                        "maxLength": 500
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Descrição",
                        "maxLength": 500
                    },
                    "eventos": {
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "*",
                                "campanha.enviada",
                                "cirurgia.fechada",
                                "comunicado.publicado",
                                "consentimento.revogado",
                                "consulta.assinada",
                                "demonstracao.pedida",
                                "documento.assinado",
                                "documento.emitido",
                                "documento_fiscal.emitido",
                                "episodio.aberto",
                                "episodio.estado_alterado",
                                "execucao.areas_confirmadas",
                                "exportacao.concluida",
                                "formulario.respondido",
                                "incidente.registado",
                                "lead.convertido",
                                "lead.criado",
                                "lead.fase_alterada",
                                "marcacao.cancelada",
                                "marcacao.confirmada",
                                "marcacao.criada",
                                "marco.concluido",
                                "motor.versao_aprovada",
                                "paciente.criado",
                                "paciente.fundido",
                                "pagamento.recebido",
                                "pedido_titular.recebido",
                                "plano.aprovado",
                                "portal.consentimento_revogado",
                                "portal.documento_enviado",
                                "portal.fotos_enviadas",
                                "portal.pedido_criado",
                                "pre_avaliacao.recebida",
                                "proposta.aceite",
                                "proposta.enviada",
                                "proposta.recusada",
                                "reclamacao.recebida",
                                "tarefa.concluida",
                                "tarefa.criada",
                                "webhook.teste"
                            ]
                        },
                        "title": "Eventos",
                        "description": "Escolha os acontecimentos que este destino recebe.",
                        "x-enum-rotulos": {
                            "*": "Todos os eventos",
                            "campanha.enviada": "Campanha enviada",
                            "cirurgia.fechada": "Cirurgia fechada",
                            "comunicado.publicado": "Comunicado interno publicado",
                            "consentimento.revogado": "Consentimento retirado",
                            "consulta.assinada": "Consulta assinada",
                            "demonstracao.pedida": "Pedido de demonstração do AnagenSys",
                            "documento.assinado": "Documento assinado",
                            "documento.emitido": "Documento emitido",
                            "documento_fiscal.emitido": "Documento fiscal emitido",
                            "episodio.aberto": "Episódio de tratamento aberto",
                            "episodio.estado_alterado": "Estado do episódio alterado",
                            "execucao.areas_confirmadas": "Áreas do dia 0 confirmadas",
                            "exportacao.concluida": "Exportação total pronta",
                            "formulario.respondido": "Formulário respondido",
                            "incidente.registado": "Incidente de segurança registado",
                            "lead.convertido": "Lead convertido em paciente",
                            "lead.criado": "Lead criado",
                            "lead.fase_alterada": "Lead mudou de fase",
                            "marcacao.cancelada": "Marcação cancelada",
                            "marcacao.confirmada": "Marcação confirmada",
                            "marcacao.criada": "Marcação criada",
                            "marco.concluido": "Marco do acompanhamento concluído",
                            "motor.versao_aprovada": "Parâmetros do motor aprovados",
                            "paciente.criado": "Paciente criado",
                            "paciente.fundido": "Pacientes fundidos",
                            "pagamento.recebido": "Pagamento recebido",
                            "pedido_titular.recebido": "Pedido de titular recebido",
                            "plano.aprovado": "Plano cirúrgico aprovado",
                            "portal.consentimento_revogado": "Autorização retirada no portal",
                            "portal.documento_enviado": "Documento enviado pelo paciente",
                            "portal.fotos_enviadas": "Fotografias de acompanhamento enviadas",
                            "portal.pedido_criado": "Pedido criado no portal",
                            "pre_avaliacao.recebida": "Pré-avaliação online recebida",
                            "proposta.aceite": "Proposta aceite",
                            "proposta.enviada": "Proposta enviada",
                            "proposta.recusada": "Proposta recusada",
                            "reclamacao.recebida": "Reclamação, elogio ou sugestão recebida",
                            "tarefa.concluida": "Tarefa concluída",
                            "tarefa.criada": "Tarefa criada",
                            "webhook.teste": "Entrega de teste"
                        }
                    },
                    "ativo": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativo",
                        "default": 1
                    }
                },
                "required": [
                    "nome",
                    "url",
                    "eventos"
                ]
            },
            "Recurso_webhooks_entregas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "webhook_id": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Destino",
                        "x-anagen-recurso": "webhooks",
                        "readOnly": true
                    },
                    "evento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Evento",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "evento_id": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Id do evento",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "estado": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Estado",
                        "enum": [
                            "pendente",
                            "entregue",
                            "falhada",
                            "desistida"
                        ],
                        "x-enum-rotulos": {
                            "pendente": "Pendente",
                            "entregue": "Entregue",
                            "falhada": "Falhou (a repetir)",
                            "desistida": "Sem sucesso"
                        },
                        "readOnly": true
                    },
                    "codigo_http": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Código HTTP",
                        "readOnly": true
                    },
                    "tentativas": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Tentativas",
                        "readOnly": true
                    },
                    "duracao_ms": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "title": "Duração",
                        "x-unidade": "ms",
                        "x-casas": 2,
                        "readOnly": true
                    },
                    "proxima_tentativa_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Próxima tentativa",
                        "readOnly": true
                    },
                    "entregue_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Entregue em",
                        "readOnly": true
                    },
                    "erro": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Erro",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "resposta": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Resposta",
                        "readOnly": true
                    },
                    "conteudo": {
                        "type": [
                            "object",
                            "array"
                        ],
                        "title": "Conteúdo enviado",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-clinico": false
            },
            "Recurso_webhooks_entregas_Entrada": {
                "type": "object",
                "properties": {}
            },
            "Recurso_whatsapp_linhas": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "readOnly": true
                    },
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome da linha",
                        "maxLength": 80
                    },
                    "departamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Departamento",
                        "description": "As conversas novas desta linha entram neste departamento.",
                        "enum": [
                            "administracao",
                            "medico",
                            "enfermagem",
                            "tecnico",
                            "comercial",
                            "rececao"
                        ],
                        "x-enum-rotulos": {
                            "administracao": "Administração",
                            "medico": "Médico",
                            "enfermagem": "Enfermagem",
                            "tecnico": "Técnico",
                            "comercial": "Comercial",
                            "rececao": "Receção"
                        },
                        "default": "rececao"
                    },
                    "phone_number_id": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Identificador do número",
                        "description": "Identificador do número na plataforma da Meta (não é o número de telefone).",
                        "maxLength": 40,
                        "pattern": "/^[0-9 ]{6,40}$/"
                    },
                    "numero": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Número de telefone",
                        "description": "Preenchido ao testar a linha.",
                        "maxLength": 25
                    },
                    "waba_id": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Conta empresarial",
                        "maxLength": 40
                    },
                    "token_prefixo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Chave própria",
                        "description": "Últimos caracteres da chave própria. Vazio: usa a chave das Definições › WhatsApp.",
                        "maxLength": 255,
                        "readOnly": true
                    },
                    "token_novo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nova chave de acesso",
                        "description": "Só se esta linha usar outra chave. Guardada cifrada e nunca mostrada.",
                        "maxLength": 2000
                    },
                    "token_remover": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Remover a chave própria"
                    },
                    "principal": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Linha principal",
                        "description": "Responde às conversas sem linha e aparece primeiro.",
                        "default": 0
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 999,
                        "minimum": 0,
                        "default": 0
                    },
                    "ultima_mensagem_em": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date-time",
                        "title": "Última mensagem",
                        "readOnly": true
                    },
                    "criado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "atualizado_em": {
                        "type": "string",
                        "format": "date-time",
                        "readOnly": true
                    },
                    "_rotulos": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        },
                        "description": "Rótulos legíveis de relações e opções."
                    }
                },
                "x-anagen-modulo": "admin.definicoes",
                "x-anagen-clinico": false
            },
            "Recurso_whatsapp_linhas_Entrada": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nome da linha",
                        "maxLength": 80
                    },
                    "departamento": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Departamento",
                        "description": "As conversas novas desta linha entram neste departamento.",
                        "enum": [
                            "administracao",
                            "medico",
                            "enfermagem",
                            "tecnico",
                            "comercial",
                            "rececao"
                        ],
                        "x-enum-rotulos": {
                            "administracao": "Administração",
                            "medico": "Médico",
                            "enfermagem": "Enfermagem",
                            "tecnico": "Técnico",
                            "comercial": "Comercial",
                            "rececao": "Receção"
                        },
                        "default": "rececao"
                    },
                    "phone_number_id": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Identificador do número",
                        "description": "Identificador do número na plataforma da Meta (não é o número de telefone).",
                        "maxLength": 40,
                        "pattern": "/^[0-9 ]{6,40}$/"
                    },
                    "numero": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Número de telefone",
                        "description": "Preenchido ao testar a linha.",
                        "maxLength": 25
                    },
                    "waba_id": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Conta empresarial",
                        "maxLength": 40
                    },
                    "token_novo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "title": "Nova chave de acesso",
                        "description": "Só se esta linha usar outra chave. Guardada cifrada e nunca mostrada.",
                        "maxLength": 2000
                    },
                    "token_remover": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Remover a chave própria"
                    },
                    "principal": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Linha principal",
                        "description": "Responde às conversas sem linha e aparece primeiro.",
                        "default": 0
                    },
                    "ativa": {
                        "type": [
                            "boolean",
                            "null"
                        ],
                        "title": "Ativa",
                        "default": 1
                    },
                    "ordem": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "title": "Ordem",
                        "maximum": 999,
                        "minimum": 0,
                        "default": 0
                    }
                },
                "required": [
                    "nome",
                    "departamento",
                    "phone_number_id"
                ]
            }
        },
        "responses": {
            "ErroValidacao": {
                "description": "Dados inválidos",
                "headers": {
                    "X-Request-Id": {
                        "$ref": "#/components/headers/XRequestId"
                    }
                },
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/RespostaErro"
                        },
                        "example": {
                            "ok": false,
                            "erro": {
                                "codigo": "validacao",
                                "mensagem": "Há dados por corrigir.",
                                "campos": {
                                    "email": "Indique um email válido."
                                }
                            }
                        }
                    }
                }
            },
            "NaoAutenticado": {
                "description": "Sem autenticação válida",
                "headers": {
                    "X-Request-Id": {
                        "$ref": "#/components/headers/XRequestId"
                    }
                },
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/RespostaErro"
                        },
                        "example": {
                            "ok": false,
                            "erro": {
                                "codigo": "nao_autenticado",
                                "mensagem": "Falta o token de acesso."
                            }
                        }
                    }
                }
            },
            "SemPermissao": {
                "description": "Sem permissão",
                "headers": {
                    "X-Request-Id": {
                        "$ref": "#/components/headers/XRequestId"
                    }
                },
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/RespostaErro"
                        },
                        "example": {
                            "ok": false,
                            "erro": {
                                "codigo": "sem_permissao",
                                "mensagem": "Não tem permissão para aceder a este conteúdo."
                            }
                        }
                    }
                }
            },
            "NaoEncontrado": {
                "description": "Não encontrado",
                "headers": {
                    "X-Request-Id": {
                        "$ref": "#/components/headers/XRequestId"
                    }
                },
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/RespostaErro"
                        },
                        "example": {
                            "ok": false,
                            "erro": {
                                "codigo": "nao_encontrado",
                                "mensagem": "Não encontrado."
                            }
                        }
                    }
                }
            },
            "Conflito": {
                "description": "Conflito",
                "headers": {
                    "X-Request-Id": {
                        "$ref": "#/components/headers/XRequestId"
                    }
                },
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/RespostaErro"
                        },
                        "example": {
                            "ok": false,
                            "erro": {
                                "codigo": "conflito",
                                "mensagem": "O estado atual impede a operação."
                            }
                        }
                    }
                }
            },
            "LimiteExcedido": {
                "description": "Limite de pedidos excedido",
                "headers": {
                    "X-Request-Id": {
                        "$ref": "#/components/headers/XRequestId"
                    },
                    "Retry-After": {
                        "$ref": "#/components/headers/RetryAfter"
                    },
                    "X-RateLimit-Limit": {
                        "$ref": "#/components/headers/XRateLimitLimit"
                    },
                    "X-RateLimit-Remaining": {
                        "$ref": "#/components/headers/XRateLimitRemaining"
                    },
                    "X-RateLimit-Reset": {
                        "$ref": "#/components/headers/XRateLimitReset"
                    }
                },
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/RespostaErro"
                        },
                        "example": {
                            "ok": false,
                            "erro": {
                                "codigo": "limite_excedido",
                                "mensagem": "Demasiados pedidos."
                            }
                        }
                    }
                }
            },
            "ErroInterno": {
                "description": "Erro interno",
                "headers": {
                    "X-Request-Id": {
                        "$ref": "#/components/headers/XRequestId"
                    }
                },
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/RespostaErro"
                        },
                        "example": {
                            "ok": false,
                            "erro": {
                                "codigo": "erro_interno",
                                "mensagem": "Ocorreu um erro inesperado."
                            }
                        }
                    }
                }
            },
            "DesafioNecessario": {
                "description": "É precisa (outra) verificação do dispositivo — CHALLENGE_REQUIRED",
                "content": {
                    "application/json": {
                        "schema": {
                            "type": "object",
                            "properties": {
                                "ok": {
                                    "const": false
                                },
                                "erro": {
                                    "type": "object",
                                    "properties": {
                                        "codigo": {
                                            "const": "CHALLENGE_REQUIRED"
                                        },
                                        "mensagem": {
                                            "type": "string"
                                        },
                                        "motivo": {
                                            "type": "string",
                                            "enum": [
                                                "em_falta",
                                                "expirado",
                                                "reforcado"
                                            ]
                                        },
                                        "desafio": {
                                            "$ref": "#/components/schemas/DesafioEscudo"
                                        }
                                    }
                                }
                            }
                        },
                        "example": {
                            "ok": false,
                            "erro": {
                                "codigo": "CHALLENGE_REQUIRED",
                                "mensagem": "A verificação do dispositivo tinha expirado e já foi renovada. Volte a tentar.",
                                "motivo": "expirado",
                                "desafio": {
                                    "desafio": "eyJ2IjoxLCJpZCI6….9f2c…",
                                    "salt": "3f8a1c0e9b7d4a2f6e5c1b0a9d8e7f60",
                                    "bits": 17,
                                    "nivel": 0,
                                    "valido_por": 300,
                                    "minimo_ms": 0
                                }
                            }
                        }
                    }
                }
            },
            "ContaEmEspera": {
                "description": "A conta está em espera — ACCOUNT_COOLDOWN (com Retry-After)",
                "content": {
                    "application/json": {
                        "schema": {
                            "type": "object",
                            "properties": {
                                "ok": {
                                    "const": false
                                },
                                "erro": {
                                    "type": "object",
                                    "properties": {
                                        "codigo": {
                                            "const": "ACCOUNT_COOLDOWN"
                                        },
                                        "mensagem": {
                                            "type": "string"
                                        },
                                        "espera": {
                                            "type": "integer"
                                        }
                                    }
                                }
                            }
                        },
                        "example": {
                            "ok": false,
                            "erro": {
                                "codigo": "ACCOUNT_COOLDOWN",
                                "mensagem": "Por segurança, esta conta só aceita nova tentativa dentro de 30 segundos.",
                                "espera": 30
                            }
                        }
                    }
                }
            }
        }
    }
}